为什么字符串“我不明白”。进入字符串池。
"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 == str3is的原因true与字符串池无关(俚语是“字符串实习”)。两者相等,因为StringBuffer.append返回append调用 的对象,即str2。你没有第二个对象——只有一个对象有StringBuffer两个引用。其内容StringBuffer是" I don't"和" get it."字符串的连接。