每次调用StringBuffer#toString和StrinBuilder#toString都会从字符串池返回新的实例或实例?

时间:2013-07-18 10:25:29

标签: java string stringbuilder stringbuffer

我的问题是,如果我使用StringBuffer(或StringBuilder),并且我多次在实例上调用toString方法。 StringBuffer每次都会返回String的新实例,还是从String池返回String? (假设我没有在调用之间对StringBuffer做任何更改)

3 个答案:

答案 0 :(得分:4)

只有字符串文字放在String常量池中。例如String s = "abc";将位于字符串池中,String s = new String("abc")将不会。 toString()方法创建了一个新字符串,因此返回的字符串不会来自文字池。

每当遇到toString()方法时,都会创建一个新的String。

只有在执行以下操作时,才会再次引用字符串常量池对象。

String s = "abc";
String s1 = "abc";

这意味着参考变量ss1都将引用常量池中的相同abc字面值。

您可以在此处找到有关字符串常量池的有用文章。 http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

答案 1 :(得分:4)

根据StringBuffer

toString()的文档
  

转换为表示此字符串缓冲区中数据的字符串。分配并初始化一个新的String对象,以包含当前由此字符串缓冲区表示的字符序列。然后返回此String。对字符串缓冲区的后续更改不会影响String的内容。

所以,分配并初始化一个新的String对象

通过new运算符分配的

String objects存储在堆中,并且没有共享相同内容的存储空间,而String文字存储在公共池中。

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

其中s1 == s2 == s3 but s4 != s5

答案 2 :(得分:1)

是调用toStringStringBuffer的{​​{1}}方法,每次都会创建一个新的字符串对象,因为这些方法使用StringBuilder关键字返回字符串。

以下是StringBuffer类的toString代码:

new

这是StringBuilder类的toString方法:

  public synchronized String toString() {
        return new String(value, 0, count);
    }