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

Пул строк и постоянный пул

Этот вопрос может быть глупым. Но я совершенно смущен. Нужна помощь в понимании пула строк и постоянного пула. Я понимаю, что для интернирования строк и пула строк.

  String s1 = "Hello";
  String s2 = "Hello"; 

Теперь оба относятся к одному и тому же объекту из-за интернирования. (i.e) Поскольку строки неизменяемы, создается только один объект, и оба относятся к одному и тому же объекту.

И также постоянный пул - это то, что содержит все константы (integer, string и т.д.), которые объявляются в классе. Это характерно для каждого класса.

 System.out.println("Hello");  //I believe this Hello is different from above.

Мои вопросы:

  • Поддерживает ли пул строк пул постоянного объекта string в пуле констант?
  • Если да, является ли пул строк общим для всего приложения или конкретным для класса?

Спасибо.

4b9b3361

Ответ 1

Мои вопросы:

  • Поддерживает ли пул строк пул постоянного объекта string в пуле констант?

Нет.

"Константный пул" относится к специально отформатированному набору байтов в файле класса, который имеет значение для загрузчика класса Java. "Строки" в нем сериализованы, они не являются объектами Java. Есть также много видов констант, а не только строки в нем.

См. Глава 4.4 таблица с постоянным пулом

Инструкции виртуальной машины Java не зависят от компоновки времени выполнения классов, интерфейсов, экземпляров классов или массивов. Вместо этого инструкции относятся к символической информации в таблице constant_pool.

В отличие от этого, "String pool" используется во время выполнения (не только во время загрузки класса), содержит только строки, а "строки" в пуле строк - это java-объекты. "Пул строк" ​​- это потокобезопасная слабая карта из экземпляров java.lang.String в экземпляры java.lang.String, используемые для внутренних строк.

Глава 3.10.5. Строковые литералы говорят

Строковый литерал является ссылкой на экземпляр класса String (§ 4.3.1, п. 4.3.3).

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

Ответ 2

Существует только один пул строк, и все строковые литералы автоматически интернированы.
Кроме того, существуют другие пулы для автобоксинга и т.д.

Постоянный пул - это то, где эти литералы помещаются для класса.