给定以下代码:
StringBuffer str2 = new StringBuffer(" I don't");
StringBuffer str3 = str2.append(" get it.");
if (str2 == str3)
{
System.out.println("Equal");
}我的讲师说,在这种情况下,str2和str3将引用同一个对象,字符串"I‘t get it“将被插入到”字符串池“中。
我想我明白为什么str2和str3现在会引用同一个对象了,但是为什么字符串"I‘t get it“呢?在发生str3赋值时进入字符串池?
例如,如果我这样做:
String s = "abcd";然后我知道现在字符串"abcd“将被插入到”字符串池“中,如果它还不在那里的话。
我很想得到一个解释。
发布于 2013-04-03 20:44:10
为什么字符串"I‘t
it.“进入字符串池。
"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时使用的字符串常量相同。
您可以同时运行the first和the second程序,亲自查看其中的区别。
str2 == str3是true的原因与字符串池无关(俚语是"string interning")。这两者是相等的,因为StringBuffer.append返回调用append的对象,即str2。您没有第二个对象--只有一个StringBuffer有两个引用。该StringBuffer的内容是" I don't"和" get it."字符串的连接。
发布于 2013-04-03 21:20:41
您缺少的是string literal的概念。
在以下情况下添加到池中的字符串:
已经不在池子里了。
在您的示例中,您将字符串文字放入StringBuffer类型的对象中。要从该对象检索字符串,必须调用toString()。要将结果添加到字符串池,还必须对该字符串调用intern()。
来证明我们可以执行一个简单的测试。
String s1 = "This is a simple test";
String s2 = "This is a simple test";
System.out.println(s1 == s2);
StringBuffer sb1 = new StringBuffer(s1);
StringBuffer sb2 = new StringBuffer(s2);
String result1 = sb1.toString();
String result2 = sb2.toString();
System.out.println(result1 == result2);
String internedResult1 = result1.intern();
String internedResult2 = result2.intern();
System.out.println(internedResult1 == internedResult2);代码输出将为:
true
错误
真正的
发布于 2013-04-03 20:44:38
你比较的是StringBuffer对象,而不是(内嵌的)String,如果你看一下StringBuffer.append( String )的实现,你会注意到它以return this;结尾,因此你的str2和str3是同一个对象。
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}编辑:虽然代码中的两个字符串字面量是内嵌的(在“字符串池”中),但组合后的字符串"I‘t get it“不会被内嵌。通过检查StringBuffer代码(在内部将组合表示为char[]数组),可以清楚地看出这一点。
干杯,
https://stackoverflow.com/questions/15787628
复制相似问题