Я все запутался после прочтения статьи на javaranch-сайте Кори МакГлоун, автором The SCJP Tip Line. названные строки, буквально и
Руководство программиста SCJP Java 6 по Kathy Sierra (co-founder of javaranch) and Bert Bates
.
Я попытаюсь процитировать то, что г-н Кори и г-жа Кэти Сьерри процитировали о String Literal Pool.
1. По словам г-на Кори МакГлоуна:
-
String Literal Pool - это набор ссылок, который указывает на объекты String.
-
String s = "Hello";
(Предположим, что в куче нет объекта с именем "Hello" ) создаст объект String"Hello"
в куче и поместит ссылку на этот объект в пул строк (String Literal Pool) (константная таблица) -
String a = new String("Bye");
(Предположим, что в куче нет объекта с именем "Bye", операторnew
обязывает JVM создавать объект в куче.
Теперь объяснение оператора "new"
для создания String и его ссылки немного запутанно в этой статье, поэтому я помещаю код и объяснение самой статьи как таковой ниже.
public class ImmutableStrings
{
public static void main(String[] args)
{
String one = "someString";
String two = new String("someString");
System.out.println(one.equals(two));
System.out.println(one == two);
}
}
В этом случае мы фактически немного отличаемся от ключевого слова "new."
В этом случае ссылки на два строковых литерала по-прежнему помещаются в таблицу констант (пул строковых литералов),
но, когда вы приходите к ключевому слову "new,"
, JVM обязан создать новый объект String во время выполнения,
а не использовать одну из таблицы констант.
Вот диаграмма, объясняющая это.
Значит ли это, что в String Literal Pool тоже есть ссылка на этот объект?
Вот ссылка на статью Кори МакГлон
http://www.javaranch.com/journal/200409/Journal200409.jsp#a1
2. По словам Кэти Сьерра и Берта Бейтса в книге SCJP:
-
Чтобы сделать Java более эффективной с точки зрения памяти, JVM выделил специальную область памяти под названием "String constant pool", когда компилятор встречает String Literal, он проверяет пул, чтобы увидеть, уже ли идентичная строка уже вышла или нет. Если нет, то создается новый строковый литерал.
-
String s = "abc";
//Создает один объект String и одну ссылочную переменную....это прекрасно, но Теперь нижеследующее утверждение меня смутило.
-
String s = new String("abc")
//Создает два объекта и одну ссылочную переменную.В книге говорится, что... новый объект String в нормальной (без пула) памяти и "s" будет ссылаться на него... тогда как дополнительный лимит "abc" будет помещен в пул.
Вышеупомянутые строки в книге сталкиваются с тем, что было в статье Кори МакГлон.
-
Если String Literal Pool представляет собой набор ссылок на объект String, упомянутый Кори МакГлоном, буквальный объект "abc" будет помещен в пул, как указано в книге.
-
И где находится этот строковый литературный пул.
-
Пожалуйста, устраните это сомнение, хотя это не будет иметь большого значения при написании кода, но очень важно с точки зрения управления памятью и вот почему я хочу очистить этот фонд.