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