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

Sam*_*Sam 4 java

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

Era*_*ran 10

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

你没有String在StringBuilder.字符存储在a中char[],当您调用时toString(),String会创建一个new :

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

也就是说,创建一个新的String不会将它添加到String池中,所以没有什么可以避免的.

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

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


ern*_*t_k 6

toString()这些类中的实现看起来像:

return new String(value, 0, count); // StringBuilder
return new String(toStringCache, true); // StringBuffer
Run Code Online (Sandbox Code Playgroud)

这些不是文字,它们创建的新String对象不会最终出现在字符串池中.