Количество строк в пуле с 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