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

Java 每次调用StringBuffer#toString和StrinBuilder#toString都会返回新实例或字符串池中的实例?,java,string,stringbuilder,stringbuffer,Java,String,Stringbuilder,Stringbuffer,我的问题是,我是否使用StringBuffer(或StringBuilder),以及是否多次调用实例上的toString方法。StringBuffer会每次返回字符串的新实例还是从字符串池返回字符串?(假设在调用之间我没有对StringBuffer做任何更改)只有字符串文本被放置在字符串常量池中。e、 g.String s=“abc”将在字符串池中,而string s=new string(“abc”)将不在字符串池中toString()方法创建了一个新字符串,因此返回的字符串不会来自文本池 每

我的问题是,我是否使用StringBuffer(或StringBuilder),以及是否多次调用实例上的toString方法。StringBuffer会每次返回字符串的新实例还是从字符串池返回字符串?(假设在调用之间我没有对StringBuffer做任何更改)

只有字符串文本被放置在字符串常量池中。e、 g.
String s=“abc”将在字符串池中,而
string s=new string(“abc”)
将不在字符串池中
toString()
方法创建了一个新字符串,因此返回的字符串不会来自文本池

每当遇到
toString()
方法时,就会创建一个新字符串

仅当您执行以下操作时,才会再次引用字符串常量池对象

String s = "abc";
String s1 = "abc";
这意味着引用变量
s
s1
将引用常量池中相同的
abc
literal


您可以在这里找到有关字符串常量池的有用文章

Yes调用
toString
方法的
StringBuffer
StringBuilder
每次都会创建一个新的字符串对象,因为这些方法使用
new
关键字返回字符串

以下是StringBuffer类中toString的代码:

  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);
    }
根据
StringBuffer

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

因此,将分配并初始化一个新的字符串对象

通过new operator分配的
String对象
存储在堆中,相同内容不共享存储,其中as
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

toString方法的可能重复总是返回一个新的字符串实例,因为API文档中就是这样记录它们的。它们的实际实现方式与此无关。@jarnbjo您可以相信文档或代码。代码总是比文档提供更多的洞察力。在这种情况下,我发现两者都是正确的。但是我喜欢深入了解我用来了解内部的api代码。如果你想知道标准api中的方法是做什么的,你必须查看api文档。如果您可以在实际代码中找到更多的知识,那么这只是一个特定于实现的细节,对于您正在查看的虚拟机版本是有效的。您绝对不能保证其他VM(来自其他供应商或来自同一供应商的其他版本)显示相同的行为。“您绝对不能保证其他VM(来自其他供应商或来自同一供应商的其他版本)显示相同的行为。”本部分也适用于文档。无论如何,没有进一步的争论,你有一个观点,我很感激。不,那部分不适用于API文档。所有虚拟机都必须实现Oracle文档中记录的标准API的功能。