如何实现StringBuilder以避免不可变的字符串分配问题?

Sha*_*pta 2 java string stringbuilder

如何StringBuilder实现以避免不可变的字符串分配问题?

StringBuilder aliasA = new StringBuilder("a");
StringBuilder dot = new StringBuilder(".");
Clausula clause1 = new Clausula(aliasA.append(dot).append("id").toString());
Clausula clause2 = new Clausula(aliasA.append(dot).append("name").toString());
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 6

通过使用char数组.您可以在JDK源代码中看到这一点.在JDK 1.8(我有一个方便的源代码)中,StringBuilder构建在它之上AbstractStringBuilder使用它来保存数据:

char[] value;
int    count;
Run Code Online (Sandbox Code Playgroud)

(Karol Dowbecki说 JDK 9"有时"使用byte而不是char;我没有理由怀疑他.:-))

count告诉班级value实际数据与阵列中的可用空间有多少.它从a开始char[16](除非你事先告诉它你可能需要什么容量)并根据需要重新分配和复制.

它只在你调用时创建一个字符串toString,使用String(char[],int,int)构造函数(或者可能是byte[]有时接受JDK9)来复制实际使用的数组内容部分:

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


Kar*_*cki 5

它在幕后使用 a char[](或byte[]在 JDK 9 或更高版本中)来存储字符。新的 String 对象仅在调用后创建StringBuilder.toString()