Подтвердить что ты не робот

Создание строки Java и пул строк String

Когда String создается с использованием ключевого слова new, он создает новый объект String, используя конструктор, который принимает строковый литерал. Я задаюсь вопросом, сохраняется ли литерал в постоянном пуле до того, как вызывается конструктор String.

Причина, по которой я спрашиваю, заключается в том, что в "Руководстве по программированию IEEE SE 7 Java SE 7" Мала Гупта пишет:

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.
}

В первой строке она говорит, что объект String, созданный новым, не сохраняется в пуле констант. Это прекрасно, но неясно, есть ли буквальное "лето", которое идет в конструкторе в первой строке.

Во второй строке она говорит, что назначение "Лето" на лето2 хранит его в постоянном пуле, что подразумевает, что буквальная строка в первой строке не была помещена в пул.

Мой вопрос

  • Строка 1: Литеральное "Лето" в конструкторе помещается в постоянный пул до того, как вызывается конструктор строк?
  • Строка 2: "Летнее" уже существует в пуле в строке 2 или оно вставлено в эту строку?
  • Строка 2: автор ошибается, когда говорит, что "Лето" вставлено в пул в строке 2?
4b9b3361

Ответ 1

Короче говоря, без путаницы,

Вы писали,

   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 создан в куче.

Позволяет ли буквальное "лето" в конструкторе помещаться в постоянный пул до того, как вызывается конструктор String?

Да. Он переходит в пул, поскольку это строковый литерал.

Есть ли "Лето" уже в пуле в строке 2 или он вставлен в эту строку?

Нет. Есть два литерала, так как вы не интернированы. (подробнее о Интерпретация строк)

Является ли автор неправильным, когда она говорит, что "Лето" помещается в пул по строке 2?

Другое верно для этой строки.

Для напоминания мы можем просто сказать, что все между "" входит в пул независимо от того, где он используется.

Ответ 2

Код 1 - Строка 1: Литерал "Лето" в конструкторе помещается в постоянный пул перед вызовом конструктора String?

Да. Состояние JLS:

Это связано с тем, что строковые литералы - или, в более общем смысле, строки, которые являются значениями константных выражений (§15.28) - "интернированы" , чтобы обмениваться уникальными экземплярами, используя метод String. стажер.

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

Код 1 - Строка 2: "Лето" уже существует в пуле по строке 2 или вставлено в эту строку?

Как и выше, он уже вставлен.

Код 2 - Строка 2: автор ошибается, когда говорит, что "Лето" помещается в пул по строке 2?

Нет, хотя я согласен, что формулировка могла быть более ясной.

Ответ 3

**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 будет размещать там "лето".

Ответ 4

    public static void main(String[] args)
    {
        String summer  = new String("Summer");   //Line 1: The code creates a new String object 
}

со значением Summer. Этот объект не помещается в пул констант String.

Это утверждение неверно. ABove line создаст 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