Количество строк в пуле с println
Я готовлюсь к экзамену OCA SE 7, и некоторые из этих вопросов действительно (!) сложны.
В одной из книг, которые я использовал, я нашел ошибку, я думаю, поэтому я хотел бы подтвердить следующее, пожалуйста...
public static void main(String... args) {
String autumn = new String("autumn"); // line one
System.out.println("autumn" == "summer"); // line two
}
После выполнения метода println
, сколько объектов String
есть в пуле?
Я понимаю, что:
- строка не добавляет строку в пул
- строка вторая создает "осень" и "лето" и добавляет их в пул
Итак, правильный ответ в книге - 2.
Однако я также думаю... поскольку я должен быть параноидальным с экзаменационными вопросами... что также создается строка "false" и добавляется в пул... Поэтому я думаю, что 3 должен быть правильным ответом... или происходит какая-то другая черная магия, например... "true" и "false" уже помещены в пул по JVM по умолчанию или что-то?...
Может кто-нибудь подтвердит?
Изменить:
после некоторых исследований я обнаружил, что мне было несправедливо говорить о "ошибке" в книге; как общий совет: вопросы экзамена обычно формулируются в терминах "следующего кода"; поэтому они явно заинтересованы в простом простом вычислении того, что сам код сам делает. Поэтому область видимости не позволяет проверять реализацию реализации println(boolean b)
или компилятора. Достаточно справедливо:)
Ответы
Ответ 1
Это должно быть 2 строки: "autumn"
и "false"
. Первая создается первой строкой. Вторая создается второй строкой, потому что компилятор оптимизирует ее только:
System.out.println(false);
который заканчивается вызовом PrintStream#print(boolean)
:
public void print(boolean b) {
write(b ? "true" : "false");
}
Это то, что происходит во время выполнения, то есть после выполнения кода. Однако на уровне константного пула, хранящегося в байт-коде, создается только одна строковая константа, которая "autumn
"в классе файла класса, который содержит ваш метод main
. Вы можете проверить это, выполнив:
javap -c -verbose ClassName
Ответ 2
true и false не являются объектами String, поэтому они не учитываются. Несмотря на то, что экзаменационные вопросы должны быть сложными, цель состоит в том, чтобы проверить понимание общих понятий. Что в этом случае: во время загрузки класса (перед запуском) строковые литералы загружаются в постоянный пул. Таким образом, "осень" и "лето" будут в постоянном пуле.
Здесь хорошо сказано:
http://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html