Используя массив char
. Вы можете увидеть это в источнике JDK. В JDK 1.8 (тот, который у меня есть удобный источник), StringBuilder
построен поверх AbstractStringBuilder
, который использует это для хранения данных:
char[] value;
int count;
( Кароль Доубеки говорит , что 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);
}