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

3
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());

3
也许你可以查看StringBuilder的代码,它是开源的。 - xingbin
1
因为向 StringBuilder 追加内容并不会创建一个新的对象。 - achAmháin
你可以阅读以下内容。我会给你一些提示。 https://docs.oracle.com/javase/tutorial/java/data/buffers.html - joemokenela
1
StringBuilder 基本上与 String 相同,因为两者原则上都是对 char[] 的包装。唯一(相关的)区别在于,StringBuilder 提供了 API 方法来更改该数组,而 String 则没有。 - Andy Turner
2个回答

10
通过使用char数组。您可以在JDK源代码中看到这一点。在JDK 1.8(我手头有源代码的版本)中,StringBuilder是建立在AbstractStringBuilder之上的,它使用此数组来保存数据。
char[] value;
int    count;

(Karol Dowbecki表示,JDK 9“有时”使用byte而不是char;我没有理由怀疑他。:-) ) count告诉类实际数据与数组中可用空间的比例。它最初使用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);
}

5

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接