StringBuilder或StringBuffer的toString()方法是否会创建一个新的不可变String?

时间:2018-05-01 06:34:16

标签: java

我们知道,java String是不可变的,为了创建可变的String,我们可以使用StringBufferStringBuilder。现在,如果我们在StringBuilder对象中有一个String并且我们使用它的toString()方法,那么它将在String池中创建另一个不可变的String。如果是这样,那么如何避免这种情况。

4 个答案:

答案 0 :(得分:10)

  

现在,如果我们在StringBuilder对象中有一个String并且我们使用它的toString()方法,那么它将在String池中创建另一个不可变的String

String中没有StringBuilder。字符存储在char[]中,当您致电toString()时,会创建一个新的String

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

也就是说,创建新的String并不会将其添加到String池中,因此您无需避免任何事情。

  

我们使用StringBuilder的主要目的是避免不可变的字符串

这不准确。主要目的是避免由于多个String连接而创建多个String。使用StringBuilder允许您使用单个StringBuilder实例执行所有连接。如果您想要String代表StringBuilder的内容,则无法避免创建一个String实例。但是,您不必创建String内容的StringBuilder表示形式(除非您需要将其传递给需要String的方法)。

答案 1 :(得分:6)

这些类中return new String(value, 0, count); // StringBuilder return new String(toStringCache, true); // StringBuffer 的实现如下:

String

这些不是文字,它们是创建一个新的View(df)对象,它不会在字符串池中结束。

答案 2 :(得分:1)

,当您在StringBuilder对象上调用 toString()时,它将创建另一个字符串实例

如果你想避免这种情况,你只需将方法的返回类型修改为StringBuilder而不是String,如果是这样的话,可以使用StringBuilder对象进行修改

答案 3 :(得分:0)

StringBuilder和StringBuffer扩展了AbstractStringBuilder。传递给这些类中的任何一个的String值最后调用AbstractStringBuilder中的" putStringAt(int index,String str)" 方法,其实现定义如下,

private final void putStringAt(int index, String str) {
    if (getCoder() != str.coder()) {
        inflate();
    }
    str.getBytes(value, index, coder); //value is byte[]
}

正如我们所看到的那样,它将输入String str值复制到名为value的字节数组(在验证之后,因为它是一个不同的值)。所以我们不必担心StringBuilder或StringBuffer

中的任何其他String变量

现在问题是,在调用toString方法时会创建String的对象。

StringBuilder和StringBuffer是为不同的操作集定义的。如果您对字符串池

有限制,则无需调用toString方法