我的问题是,如果我使用StringBuffer(或StringBuilder),如果我在实例上多次调用String方法。StringBuffer 是每次都返回 String 的新实例,还是从 String pool 返回 String?(假设我在两次调用之间没有对StringBuffer进行任何更改)
根据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";
这意味着引用变量 s
和 s1
都将引用常量池中的相同 abc
文本。
您可以在此处找到有关字符串常量池的有用文章。http://www.thejavageek.com/2013/06/19/the-string-constant-pool/
是的,调用
StringBuffer 和 StringBuilder
的 stringIng
方法将每次都创建一个新的字符串对象,因为这些方法使用 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);
}