Java Генерация строки во время компиляции или во время выполнения - PullRequest
0 голосов
/ 14 февраля 2020

Учитывая этот код:

if(somecondition) {
    String one = "one";
    //print one;
}

Эта строка будет сгенерирована, только когда это условие истинно?

Цените любую помощь.

Редактировать:

С пулированием строк можно с уверенностью сказать, что строка one будет добавлена ​​в пул независимо от условия.

Итак, если переменная должна быть разрешена из объекта, что произойдет?

Скажем,

String hello = "Hello Mr " + user.firstName();

Как это будет добавлено в пул строк? И когда он будет добавлен в пул строк, он не будет создавать новые литералы String правильно (если не изменяется user.firstName ()).

1 Ответ

4 голосов
/ 14 февраля 2020

Строка генерируется во время ее ввода; но для того, чтобы этот ответ имел смысл, нам нужно пройти через его преобразования в процессе сборки и запуска приложения.

  1. Сначала вы ввели его в файл *.java.
  2. Затем компилятор скопировал его в файл *.class как часть записей пула констант.
  3. Затем программа запустилась, и был запрошен класс, что вызвало загрузчик классов для копирования файла из с диска в ОЗУ, инициируя создание записи метаданных объекта для переноса константы в пул констант.

Таким образом, существует несколько мест, где его можно «создать» в зависимости от того, какое определение вы используете. "создания", которое вы будете использовать sh.

Теперь в вашем первом примере объект String реализуется не при использовании строки, а при использовании файла *.class. Тем не менее, это не ссылка на работающую программу до тех пор, пока вы не введете метод.

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

Из-за деталей вашего кода у вас есть три разные строки, которые могут быть объединены («Hello Mr», значение user.firstName() и строка, объединяющая их обоих). «Hello Mr» будет объединен с загрузкой класса (при условии объединения). Значение user.firstName() произошло бы при первоначальном создании значения для возврата. Результирующая объединенная строка будет объединена непосредственно перед назначением (или ссылкой из пула, если она уже существует в пуле).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...