为什么字符串“我不明白”。进入字符串池。
"I don't get it."
字符串不会进入实习池。
一种验证方法如下:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2.append(" get it.");
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
如果String
' 的内容被保留,则调用intern()
将返回一个不同的(“规范”)对象。如您所见,上面返回相同的对象,这意味着您调用的对象intern()
刚刚成为“规范”对象(即已被实习)。
另一方面,如果你删除append
,你会得到不同的结果:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2;
String str = new String(str3.toString());
if (str == str.intern()) {
System.out.println("It was not interned before"); // <<== This is printed
} else {
System.out.println("It was interned before");
}
现在里面的字符串str3
是" I don't"
. 它的副本已经被保留,因为它与创建str2
.
您可以并排运行第一个和第二个程序,看看自己的区别。
str2 == str3
is的原因true
与字符串池无关(俚语是“字符串实习”)。两者相等,因为StringBuffer.append
返回append
调用 的对象,即str2
。你没有第二个对象——只有一个对象有StringBuffer
两个引用。其内容StringBuffer
是" I don't"
和" get it."
字符串的连接。