Где создаются объекты Stringbuilder? - PullRequest
4 голосов
/ 23 апреля 2011

Строки являются неизменяемыми, поскольку они хранятся в пуле постоянных строк. Итак, где создаются объекты stringbuilder? Скажем, я создаю два объекта string string

StringBuilder s1 = new StringBuilder("abc");  
StringBuilder s2 = new StringBuilder("abc");

Я получу 2 отдельных объекта в памяти кучи, оба из которых содержат значения "abc"?

Ответы [ 3 ]

5 голосов
/ 23 апреля 2011

Неизменность строк имеет мало общего с постоянным пулом строк. Или, скорее, они имеют , чтобы быть неизменными, чтобы пул строк был полезным, но для того, чтобы они были неизменяемыми, необязательно должен быть пул строк.

Обратите внимание, что в пул строк обычно попадают только константы времени компиляции - если только вы не вызовете intern(). Так, например, если у вас есть:

char[] x = { 'a', 'b', 'c' };
String s1 = new String(x);
String s2 = new String(x);

затем s1 и s2 относятся к одинаковым строкам, но отдельным объектам.

Создание двух StringBuilder объектов просто создает два объекта. Точные подробности реализации того, что находится внутри StringBuilder, могут легко меняться между версиями, и я не знаю подробностей, но это может быть просто char[], созданный из строки, переданной в конструктор. (Во всяком случае, я считаю, что это касается JDK 1.6.)

0 голосов
/ 23 апреля 2011

Пул констант хранит строки, которые определены как литералы (заключенные в двойные кавычки) в исходном коде. Не буквальные строки не хранятся в СР. Они просто используют базовый массив char и следят за тем, чтобы он никогда не записывался.

StringBuilder выделяет такой массив и передает его вновь созданному объекту String.

0 голосов
/ 23 апреля 2011
String str1 = "Java"
String str2 = "Java"

Таким образом, str1 и str2 указывают на одну и ту же «Java» в пуле литералов.

String str3 = new String("Java");
String str4 = new String("Java");

str3 и str4 не указывают на одно и то же местоположение, но имеют выделенную память.

StringBuilder s1 = new StringBuilder("abc");  
StringBuilder s2 = new StringBuilder("abc");

s1 и s2 не указывают на одну и ту же ячейку памяти.

Поэтому, когда вы говорите « new », она создает отдельную память для этой переменной.

Вы можете проверить это, отобразив их адрес на консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...