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

Java 如何实现StringBuilder以避免不可变字符串分配问题?,java,string,stringbuilder,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).

如何实现
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());

在幕后,它使用一个
char[]
(或JDK 9或更新版本中的
byte[]
)来存储字符。只有在使用
char
数组调用
StringBuilder.toString()
后,才能创建新的字符串对象。您可以在JDK源代码中看到这一点。在JDK 1.8(我手头有源代码)中,
StringBuilder
构建在
AbstractStringBuilder
之上,后者使用它来保存数据:

char[] value;
int    count;
(JDK9“有时”使用
byte
而不是
char
;我没有理由怀疑他。:-)

count
告诉类
value
中有多少是实际数据,而数组中只有多少可用空间。它从一个
字符[16]
开始(除非您事先告诉它您可能需要什么容量),然后根据需要重新分配和复制

它仅在调用
toString
时创建一个字符串,使用(或者可能是一个接受
字节[]
的字节,有时是JDK9)来复制实际使用的数组内容部分:

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

也许您可以检查
StringBuilder
的代码,它是开源的。因为附加到
StringBuilder
不会创建新对象。您可以阅读以下内容。我会透露一些情况
StringBuilder
基本上与
String
相同,因为两者主要是围绕
char[]
的包装。唯一(相关)的区别是
StringBuilder
提供了更改该数组的API方法,而
String
没有。