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

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

char[] value;
int    count;

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

count告诉类value有多少是实际数据,有多少是数组中的可用空间。它从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);
}

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

最新更新