提问者:小点点

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


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


共3个答案

匿名用户

根据StringBuffer的toString()文档

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

因此,分配并初始化了一个新的 String 对象。

通过new运算符分配的String对象存储在堆中,相同内容不共享存储,其中作为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但s4!=s5

匿名用户

只有字符串文本放置在字符串常量池中。例如,字符串 s = “abc”; 将在字符串池中,而字符串 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/

匿名用户

是的,调用 StringBuffer 和 StringBuilderstringIng 方法将每次都创建一个新的字符串对象,因为这些方法使用 new 关键字返回字符串。

下面是 toString from StringBuffer 类的代码:

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

下面是StringBuilder类中的toString方法:

public String toString() {
        // Create a copy, don't share the array
        return new String(value, 0, count);
    }