假设我有一个课程如下:
class Apple {
String apple;
Apple(String apple) {
this.apple = apple;
}
}
是什么使以下代码成立?
public boolean result() {
Apple a = new Apple("apple");
Apple b = new Apple("apple");
return a.apple == b.apple;
}
Java是否自动在我的对象实例中设置实习字符串?
Java是否只有在使用new String("...")
创建它们时才实习?
修改:
感谢您的回答,这个问题的扩展就是说
Apple a = new Apple(new String("apple"));
Apple b = new Apple(new String("apple"));
使用相同的测试返回 false 。
这是因为我将一个String实例传递给构造函数而不是String文字。
答案 0 :(得分:3)
Java是否自动在我的对象实例中设置实习字符串?
重点是:当您创建第一个Apple a
时,JVM会提供包含String
的{{1}}实例。 此"apple"
已添加到String
。
因此,当您创建第二个StringPool
,重用Apple b
时,您在String
和a.apple
中拥有相同的对象引用:
示例:强>
b.apple
输出:
Apple a = new Apple("apple");
Apple b = new Apple(new String("apple"));
System.out.println(a.apple == b.apple);
Java没有实习字符串的时间是他们使用新字符串创建的唯一时间(" ...")?
如果将String对象与false
进行比较,则比较对象引用,而不是内容。
比较==
使用String
或String::equals()
示例强>
String::intern()
答案 1 :(得分:1)
apple
中的字段Apple
是引用到String
。
在您的情况下,引用是指一个实习字符串,因为您已使用将被实习的字符串文字实例化Apple
。
由于a
和b
是从同一个互连字符串创建的,因此a.apple
引用与b.apple
相同的字符串。
如果使用new String
,Java确实无法实习字符串。