Когда интернируются строки Java?

Вдохновленный комментариями к этому вопросу, я почти уверен, что Java Strings interned at runtime rather than compile time - surely just the fact that classes can be compiled at different time, but would still point to the same reference at runtime.

Я не могу найти никаких доказательств, подтверждающих это. Может ли кто-нибудь обосновать это?

18
задан Community 23 May 2017 в 12:10
поделиться

1 ответ

Оптимизация происходит (или, по крайней мере, может происходить) в обоих местах:

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

(У меня смутное воспоминание, что одна из частей работы для Java 7, связанная с "маленькими файлами jar", включала пул единственной строки для всего файла jar ... но я мог очень ошибаться.)

РЕДАКТИРОВАТЬ : Раздел 5.1 спецификации JVM, «Пул констант времени выполнения» подробно описывает это:

Чтобы получить строковый литерал, Java виртуальная машина проверяет последовательность персонажей, предоставленных Структура CONSTANT_String_info.

  • Если метод String.intern имеет ранее был вызван в экземпляр класса String, содержащего последовательность символов Юникода, идентичных что задано CONSTANT_String_info структура, то результат строки буквальное происхождение - это ссылка на тот же экземпляр класса String.

  • В противном случае новый экземпляр класса Создается строка, содержащая последовательность символов Unicode задана структурой CONSTANT_String_info; этот экземпляр класса является результатом вывод строкового литерала. Ну наконец то, внутренний метод новой строки экземпляр вызывается.

17
ответ дан 30 November 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: