Как реализован StringBuilder, чтобы избежать проблемы неизменного выделения строк? - PullRequest
0 голосов
/ 03 января 2019

Как реализовать 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());

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Используя массив 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);
}
0 голосов
/ 03 января 2019

За сценой он использует char[] (или byte[] в JDK 9 или новее) для хранения символов.Новый объект String создается только после вызова StringBuilder.toString().

...