Java中是否有其他变量或对象,如果它们的值相等,它们将共享内存位置或对象引用?

时间:2016-05-27 12:37:24

标签: java string reference

我了解到以下变量将在JVM的内存中共享相同的位置,因为它们的值相同:

String banana = "yummy";
String strawberry = "yummy"; // banana == strawberry is true here

除非您为其中一个提供“new”关键字,否则:

String banana = "yummy";
String strawberry = new String("yummy"); // banana == strawberry is false

以便强制创建新的String对象。

我想知道的是,除了Java中String类的对象之外的任何其他对象是否会发生这种情况?

3 个答案:

答案 0 :(得分:3)

是的,还有其他类型适用。这是一个例子:

  Integer a = 42;
  Integer b = 42;

自动装箱产生的-128到+127范围内的Integer实例保证是同一个对象;请参阅JLS 5.1.7 BooleanByteShortCharacter也有类似的保证。它也适用于上面的更大范围,对于Long,虽然这是特定于平台的。

事实上,您真正要求的是T类型的示例,其中t1.equals(t2)暗示t1 == t2 ... T的某个子集。对于所有数组类型以及未覆盖Object.equals的任何类类型都是如此。后者的示例包括所有enum类型,java.lang.Classjava.lang.StringBuilderjava.lang.Object本身。

答案 1 :(得分:0)

不,这仅适用于String对象。

答案 2 :(得分:-1)

String banana = "yummy"; 

是对字符串池中“yummy”的引用。

String strawberry = new String("yummy");

在堆中创建新对象

字符串有方法intern()

  

返回字符串对象的规范表示。

此代码打印为true:

String banana = "yummy";
String strawberry = new String("yummy"); 
System.out.println(banana == strawberry.intern());

请参阅String javadoc

无论如何,use方法等于引用类型对象。