Создание строки Java и постоянный пул строк
когда строка создается с помощью ключевого слова новая он создает новый строковый объект с помощью конструктора, который принимает строковый литерал. Мне интересно, хранится ли литерал в пуле констант до вызова строкового конструктора.
причина, по которой я спрашиваю, заключается в том, что в "Oca Java SE 7 Programmer I Certification Guide" мала Гупта пишет:
public static void main(String[] args)
{
String summer = new String("Summer"); //Line 1: The code creates a new String object with the value "Summer". This object is not placed in the String constant pool.
String summer2 = "Summer" //Line 2: The code creates a new String object with the value "Summer" and places it in the String constant pool.
}
Она говорит в первой строке, что строковый объект, который создается новая - это не хранится в постоянном пуле. Это нормально, но неясно, является ли буквальное "лето", которое идет в конструкторе в первой строке.
на второй строке она говорит, что назначение "лето" на summer2 сохраняет его в пуле констант, что означает, что литерал в первой строке не был помещен в пул.
У Меня Вопрос
- строка 1: помещается ли литерал "лето" в конструкторе в постоянный пул перед строкой конструктора называется?
- строка 2: "Лето" уже существует в бассейне в строка 2 или он вставлен в эту строку?
- строка 2: ошибается ли автор, когда говорит, что" лето " вставляется в пул в строка 2?
4 ответов
коротко и без путаницы,
вы написали:
String summer = new String("Summer"); //Line 1: The code creates a new String object with the value "Summer". This object is not placed in the String constant pool.
это неправильно. Особенно комментарий >This object is not placed in the String constant pool.
строковый литерал "лето" теперь в бассейн. И объект summer
создается в куче.
помещается ли литерал "лето" в конструкторе в пул констант до вызова строкового конструктора?
да. Он идет в пул, поскольку это строковый литерал.
"лето" уже существует в пуле в строке 2 или оно вставлено в эту строку?
нет. Два литерала существуют, поскольку вы не интернированы. (подробнее о интернировании строк)
ошибается ли автор, когда говорит, что" лето " помещается в бассейн на линии 2?
другое правильно с этой линией.
памяти, можно даже просто сказать, что все между ""
идет в пул независимо от того, где он использует.
код 1-строка 1: помещается ли литерал "лето" в конструкторе в пул констант перед вызовом строкового конструктора?
да. JLS заявляет:
это потому, что строковые литералы-или, в более общем плане,строки, которые являются значениями константных выражений (§15.28) - будут "интернированы" чтобы поделиться уникальными экземплярами, используя строку метода.интерн.
Так как эта строка является литерал (и, следовательно, значение постоянного выражения), он будет вставлен. Однако объект, присвоенный переменной summer
Это не тот же литерал, это явно новый строковый объект, созданный для копирования значения этого литерала.
код 1-строка 2:" Лето " уже существует в пуле в строке 2 или оно вставлено в эту строку?
Как указано выше, он уже вставлен.
код 2-строка 2: автор ошибается, когда она говорит, что "лето" помещается в бассейн на линии 2?
нет-хотя я согласен, что формулировка могла бы быть более ясной.
**Code 1 - Line 1: Does the literal "Hello" in the constructor get placed in the constant pool before the String constructor is called?**
да, потому что конструктор используется для создания объекта.
****Code 1 - Line 2: Does "Hello" already exist in the pool at line 2 or is it inserted at this line?****
**уже там **. он не вставляется этой строкой. можете проверить вот так.
String s=new String("hello");
String s1=s.intern();
String s2 = new String("hello");
String s3= s2.intern();
if (s1==s3)
{
System.out.println("true");
} if (s==s2)
{System.out.println("false");}
код 2-строка 2: автор ошибается, когда говорит, что" лето " помещается в пул в строке 2?
нет. лето не будет размещаться в постоянном пуле, потому что уже там code2-line1 разместит " лето" там.
public static void main(String[] args)
{
String summer = new String("Summer"); //Line 1: The code creates a new String object
}
со значением Summer
. Этот объект не помещается в строковую константу бассейн.
Это утверждение неверно. Над линией будет создано 2 объекта, один из которых находится в постоянном пуле,а другой-в куче.Всякий раз , когда вы напишете "ABC", он перейдет в постоянный пул независимо от того, внутри конструктора или нет.
доказательство
String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh");
String s5 = new String("Rakesh").intern();
if ( s1 == s2 ){
System.out.println("s1 and s2 are same"); // 1.
}
if ( s1 == s3 ){
System.out.println("s1 and s3 are same" ); // 2.
}
if ( s1 == s4 ){
System.out.println("s1 and s4 are same" ); // 3.
}
if ( s1 == s5 ){
System.out.println("s1 and s5 are same" ); // 4.
}will return:
s1 and s2 are same
s1 and s3 are same
s1 and s5 are same