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