Является ли String Literal Pool набором ссылок на объект String или набором объектов

Я совсем запутался после прочтения статьи на сайте javaranch Кори МакГлона, автора The SCJP Tip Line. названные строки, буквально и SCJP Java 6 Programmer Guide by Kathy Sierra (co -основателя javaranch )и Bert Bates.

Я попытаюсь процитировать то, что г-н Кори и г-жа Кэти Сьерра процитировали о String Literal Pool.

1. Согласно г-ну Кори Макглоуну:

  • Пул строковых литералов — это коллекция ссылок, указывающих на объекты String.

  • String s = "Hello";(Предположим, что в куче нет объекта с именем "Hello" ), создаст объект String "Hello"в куче и поместит ссылку на этот объект в пул строковых литералов (таблицу констант)

  • String a = new String("Bye");(Предположим, что в куче нет объекта с именем «Пока», оператор newобяжет JVM создать объект в куче.

Теперь объяснение оператора "new"для создания строки и ее ссылки в этой статье немного сбивает с толку, поэтому я помещаю код и объяснение из самой статьи, как это -ниже.

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 во время выполнения -, а не использовать один из постоянной таблицы.

Вот схема, объясняющая это..

enter image description here

Значит ли это, что String Literal Pool также имеет ссылку на этот объект?

Вот ссылка на статью Кори Макглоуна

http://www.javaranch.com/journal/200409/Journal200409.jsp#a1

2. По словам Кэти Сьерра и Берта Бейтса в книге SCJP:

  • Чтобы сделать Java более эффективным с точки зрения использования памяти, JVM выделила специальную область памяти, называемую «пул строковых констант», когда компилятор встречает строковый литерал, он проверяет пул, чтобы увидеть, существует ли уже идентичная строка или нет. Если нет, то он создает новый объект строкового литерала.

  • String s = "abc";// Создает один объект String и одну ссылочную переменную....

    это хорошо, но тогда меня смутило это утверждение:

  • String s = new String("abc")// Создает два объекта и одну ссылочную переменную.

    В книге говорится, что.... новый объект String в обычной (не -пуле )памяти, и "s" будет ссылаться на него... тогда как дополнительный литерал «abc» будет помещен в пул.

    Вышеупомянутые строки в книге противоречат той, что есть в статье Кори Макглоуна.

    • Если String Literal Pool представляет собой набор ссылок на объект String, как упоминал Кори Макглоун, то почему литеральный объект «abc» будет помещен в пул (, как указано в книге )?

    • И где находится этот String Literal Pool?

Пожалуйста, развейте это сомнение, хотя это не будет иметь большого значения при написании кода, но очень важно с точки зрения управления памятью, и Вот почему я хочу очистить этот фундамент.

69
задан Matt C 29 September 2018 в 17:33
поделиться