Как объясняется в этих вопросах Stackoverflow: вопрос 1 и вопрос 2 Я понимаю, что "String литералы" интернирован, когда:
String s = "abc";
И что JVM создаст новый объект String вместо того, чтобы использовать существующий из пула строк, когда:
String s = new String("abc");
Однако у меня есть сомнения после прочтения следующих двух подобных утверждений.
Когда компилятор встречает строковый литерал, он проверяет пул, чтобы убедиться, что идентичная строка уже существует. Если совпадение найдено, ссылка на новый литерал направлена на существующую строку, и не создается новый объект литерала String.
- От JavaRanch:
В этом случае мы фактически немного отличаемся от ключевого слова "новый". В этом случае ссылки на строковые литералы по-прежнему помещаются в таблицу констант (пул строковых литералов), но когда вы переходите к ключевому слову "новый", JVM обязана создавать новый объект String во время выполнения, а не использовать одну из таблицы констант.
Итак, если мы также помещаем ссылку в непустую память И в память пула, когда мы создаем объект с использованием "нового" и основываясь на приведенных выше определениях. Не следует ли JVM возвращать ту же ссылку, когда мы это делаем?:
String one = new String("test");
String two = "test";
System.out.println(one.equals(two)); // true
System.out.println(one == two); // false
Потому что при объявлении строкового литерала String three = "test";
он уже будет существовать в пуле? и поэтому должен возвращать ту же ссылку и печатать правду? или предыдущие утверждения означают, что они будут помещены в память пула, но просто пропущены, когда используется оператор new
?