Вдохновленный комментариями к этому вопросу, я почти уверен, что Java String
s 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.
Я не могу найти никаких доказательств, подтверждающих это. Может ли кто-нибудь обосновать это?
Оптимизация происходит (или, по крайней мере, может происходить) в обоих местах:
String
, но это очевидная оптимизация. На самом деле это не интернирование как таковое - просто постоянная оптимизация. (У меня смутное воспоминание, что одна из частей работы для Java 7, связанная с "маленькими файлами jar", включала пул единственной строки для всего файла jar ... но я мог очень ошибаться.)
РЕДАКТИРОВАТЬ : Раздел 5.1 спецификации JVM, «Пул констант времени выполнения» подробно описывает это:
Чтобы получить строковый литерал, Java виртуальная машина проверяет последовательность персонажей, предоставленных Структура CONSTANT_String_info.
Если метод String.intern имеет ранее был вызван в экземпляр класса String, содержащего последовательность символов Юникода, идентичных что задано CONSTANT_String_info структура, то результат строки буквальное происхождение - это ссылка на тот же экземпляр класса String.
В противном случае новый экземпляр класса Создается строка, содержащая последовательность символов Unicode задана структурой CONSTANT_String_info; этот экземпляр класса является результатом вывод строкового литерала. Ну наконец то, внутренний метод новой строки экземпляр вызывается.