Такие вопросы о сравнении строковых и числовых констант проверяют знания о понятии
пулов литералов (literal pool). Не следует путать с
пулом констант класса. Виртуальная машина переиспользует один и тот же объект для
строкового литерала при загрузке класса, если такой уже выделен в куче. Вот почему
"Hello" == "Hello" истинно, не смотря на то что
String – ссылочный тип. Такая оптимизация возможна благодаря свойству неизменяемости (immutable) класса
String, и называется
интернирование строк.
Кроме самих литералов, интернирование применяется ко всем
константным выражениям. К таким выражениям в этом примере относятся неявное приведение числа
42 к строке и конкатенация
констант. Это делает истинным
"Hello_42" == "Hello_" + 42.
Пул литералов не работает, когда явно используется оператор new. Это причина, по которой выражение
new String("Hello_42") == "Hello_" + 42 ложно.