В Java нет перегрузки операторов, как в C ++ и C #.Таким образом, это означает, что оператор ==
всегда сравнивает ссылки.И сравниваемые строки могут быть одинаковыми, но они имеют разные ссылки.Что вызывает false
.
Но почему был истинный результат?Ну, Java создает пул строк.Все строковые литералы будут помещены в пул строк во время компиляции.Это означает, что:
String literalString1 = "foo";
String literalString2 = "foo";
literalString1 == literalString2 // true
Поскольку это обе ссылки на пул строк.
Но как только вы начнете строить строки (используя +
), будет создано new Строки в куче.Однако компилятор Java был умен и собрал два литерала String во время компиляции.
"wel"+"come" == "welcome"
Из-за того, что вы создаете их во время выполнения.Компилятор обнаружит "wel" + "come"
строковый литерал и поместит его в пул строк.И "welcome"
также является литералом, и будет искать пул строк, чтобы проверить, находится ли литерал в пуле строк.И, конечно, он найдет его и будет использовать ту же ссылку.