На данный вопрос уже ответили:
String a1 = "abc";
String a2 = "abc";
String str1 = new String("abc");
String str2 = new String("abc");
Почему при сравнении (a1 == a2) результат true, хотя они является объектами и у них разные ссылки, т.е и результат должен быть false. В чём отличие (a1 == a2) и (str1 == str2)?
Потому, что на этапе компиляции для одинаковых литералов будет создан только один объект строки.
public class Main {
public static void main(String[] args) {
String a1 = "abc";
String a2 = "abc";
}
}
Компилируем
$ javac Main.java
смотрим в байткод
$ javap -c Main
и видим
0: ldc #2 // String abc
2: astore_1
3: ldc #2 // String abc
5: astore_2
6: return
что и для a1 и для a2 ссылка в пул констант одна - #2
Строки созданные на момент компиляции указывают на один и тот же экземляр, поэтому a1 и a2 - одинаковы. Компилятор создает коллекцию -пул строк, и для созданных на момент компиляции как бы вызыается метод intern().
Для второй пары строк истиной будет str1.intern() == str2.intern()
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники