我了解到以下变量将在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类的对象之外的任何其他对象是否会发生这种情况?
答案 0 :(得分:3)
是的,还有其他类型适用。这是一个例子:
Integer a = 42;
Integer b = 42;
自动装箱产生的-128到+127范围内的Integer
实例保证是同一个对象;请参阅JLS 5.1.7 Boolean
,Byte
,Short
和Character
也有类似的保证。它也适用于上面的更大范围,对于Long
,虽然这是特定于平台的。
事实上,您真正要求的是T
类型的示例,其中t1.equals(t2)
暗示t1 == t2
... T
的某个子集。对于所有数组类型以及未覆盖Object.equals
的任何类类型都是如此。后者的示例包括所有enum
类型,java.lang.Class
,java.lang.StringBuilder
和java.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());
无论如何,use方法等于引用类型对象。