Как работает String Literal Pool - PullRequest
3 голосов
/ 18 января 2012
String str = new String("Hello");

Обычно я читал во многих статьях, доступных в Интернете, что два объекта создаются, когда мы пишем приведенное выше утверждение.Один объект String создается в куче, а один объект строки создается в пуле литералов.И объект кучи также ссылается на объект, созданный в Literal Pool.(Пожалуйста, исправьте это мое утверждение, если оно неверно.)

Обратите внимание, что приведенное выше объяснение соответствует моему пониманию после прочтения некоторых статей в Интернете.

Так что мой вопрос ...Есть любые способы остановить создание строкового объекта в литеральном пуле.Как это можно сделать?

[Пожалуйста, дайте мне знать о лучшей ссылке для понимания этого буквального пула, Как это реализовано]

Ответы [ 2 ]

5 голосов
/ 18 января 2012

Всегда есть одна строка с содержимым "Hello" в пуле литералов. Любой код, который использует строковую константу со значением «Hello», будет использовать ссылку на этот объект. Поэтому обычно ваш оператор будет создавать один новый String объект каждый раз, когда он выполняется. Этот конструктор String (IIRC) создаст копию базовых данных из передаваемой в него строковой ссылки, поэтому фактически к тому времени, когда конструктор завершит работу, эти два объекта не будут иметь общих ссылок. (Конечно, это деталь реализации. Имеет смысл, когда передаваемая вами строковая ссылка представляет собой представление большего char[] - одна из причин для вызова этого конструктора - избегать ненужного зависания большого char[].)

Пул строк используется для уменьшения количества объектов, создаваемых из-за постоянных строковых выражений в коде. Например:

String a = "Hello";
String b = "He" + "llo";
String c = new String(a);

boolean ab = a == b; // Guaranteed to be true
boolean ac = a == c; // Guaranteed to be false

То есть a и b относятся к одному и тому же строковому объекту (из пула), но c относится к другому объекту.

2 голосов
/ 18 января 2012

Если я правильно понимаю ваш вопрос, вы спрашиваете, как инициализировать строку, не помещая ее в пул строковых литералов. Этого можно избежать, если вы не объявляете строковое литеральное выражение (не объявляйте последовательность символов в двойных кавычках).

// these two strings will be placed in the string literal pool
String one = "one";             
String two = new String("two");
// this third string will NOT be placed in the string literal pool
String three = new String(new char[] {'t', 'h', 'r', 'e', 'e'});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...