给出以下代码:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2.append(" get it.");
if (str2 == str3)
{
System.out.println("Equal");
}
Run Code Online (Sandbox Code Playgroud)
我的讲师说,在这种情况下都str2与str3将指向同一个对象,字符串"我不明白"会被插入到"字符串池".
我认为我得到了原因str2,str3现在将引用相同的对象,但为什么字符串"我不明白".在str3分配发生时进入字符串池?
例如,如果我这样做:
String s = "abcd";
Run Code Online (Sandbox Code Playgroud)
然后我知道现在字符串"abcd"将插入"字符串池",如果它还没有.
我很乐意得到解释.
为什么字符串"我不明白".进入字符串池.
该"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");
}
Run Code Online (Sandbox Code Playgroud)
如果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");
}
Run Code Online (Sandbox Code Playgroud)
现在里面的字符串str3是" I don't".它的副本已经被实现,因为它与创建时使用的字符串常量相同str2.
原因str2 == str3是true与字符串池无关(俚语是"字符串实习").两者是相等的,因为StringBuffer.append返回append调用它的对象,即str2.你没有第二个对象 - 只有一个对象有StringBuffer两个引用.其内容StringBuffer是" I don't"和" get it."字符串的串联.
| 归档时间: |
|
| 查看次数: |
1875 次 |
| 最近记录: |