首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StringBuffer和字符串池

StringBuffer和字符串池
EN

Stack Overflow用户
提问于 2013-04-03 20:40:28
回答 6查看 2.2K关注 0票数 7

给定以下代码:

代码语言:javascript
复制
StringBuffer str2 = new StringBuffer(" I don't");
    StringBuffer str3 = str2.append(" get it.");
    if (str2 == str3)
    {
        System.out.println("Equal");
    }

我的讲师说,在这种情况下,str2str3将引用同一个对象,字符串"I‘t get it“将被插入到”字符串池“中。

我想我明白为什么str2str3现在会引用同一个对象了,但是为什么字符串"I‘t get it“呢?在发生str3赋值时进入字符串池?

例如,如果我这样做:

代码语言:javascript
复制
 String s = "abcd";

然后我知道现在字符串"abcd“将被插入到”字符串池“中,如果它还不在那里的话。

我很想得到一个解释。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-04-03 20:44:10

为什么字符串"I‘t

it.“进入字符串池。

"I don't get it."字符串未进入缓冲池。

验证它的一种方法如下:

代码语言:javascript
复制
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,则会得到不同的结果:

代码语言:javascript
复制
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 firstthe second程序,亲自查看其中的区别。

str2 == str3true的原因与字符串池无关(俚语是"string interning")。这两者是相等的,因为StringBuffer.append返回调用append的对象,即str2。您没有第二个对象--只有一个StringBuffer有两个引用。该StringBuffer的内容是" I don't"" get it."字符串的连接。

票数 5
EN

Stack Overflow用户

发布于 2013-04-03 21:20:41

您缺少的是string literal的概念。

在以下情况下添加到池中的字符串:

  • 它被定义为文字。你可以对它调用
  • 方法。

已经不在池子里了。

在您的示例中,您将字符串文字放入StringBuffer类型的对象中。要从该对象检索字符串,必须调用toString()。要将结果添加到字符串池,还必须对该字符串调用intern()

来证明我们可以执行一个简单的测试。

代码语言:javascript
复制
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

错误

真正的

票数 2
EN

Stack Overflow用户

发布于 2013-04-03 20:44:38

你比较的是StringBuffer对象,而不是(内嵌的)String,如果你看一下StringBuffer.append( String )的实现,你会注意到它以return this;结尾,因此你的str2str3是同一个对象。

代码语言:javascript
复制
public synchronized StringBuffer append(String str) {
super.append(str);
    return this;
}

编辑:虽然代码中的两个字符串字面量是内嵌的(在“字符串池”中),但组合后的字符串"I‘t get it“不会被内嵌。通过检查StringBuffer代码(在内部将组合表示为char[]数组),可以清楚地看出这一点。

干杯,

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15787628

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档