String и сравнение через == [дубликат]

190
15 февраля 2018, 15:11

На данный вопрос уже ответили:

  • Как сравнивать строки в Java? 2 ответа
    String a1 = "abc";
    String a2 = "abc";
    String str1 = new String("abc");
    String str2 = new String("abc");

Почему при сравнении (a1 == a2) результат true, хотя они является объектами и у них разные ссылки, т.е и результат должен быть false. В чём отличие (a1 == a2) и (str1 == str2)?

Answer 1

Потому, что на этапе компиляции для одинаковых литералов будет создан только один объект строки.

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

Answer 2

Строки созданные на момент компиляции указывают на один и тот же экземляр, поэтому a1 и a2 - одинаковы. Компилятор создает коллекцию -пул строк, и для созданных на момент компиляции как бы вызыается метод intern().

Для второй пары строк истиной будет str1.intern() == str2.intern()

READ ALSO
Роль interface в Java

Роль interface в Java

Здравствуйте, давно читаю разные туториалы и много где встречаю должно быть мало зависимостей, как я понял это все достигается при помощи...

213
Отделение логики приложения от Swing-потока

Отделение логики приложения от Swing-потока

Добрый деньЯ пишу приложение с графическим интерфейсом используя Swing

132
Отключение локализации библиотеки в Android приложении

Отключение локализации библиотеки в Android приложении

Всем приветТакой вопрос, как отключить локализацию текстов в UI подключаемой библиотеки? Использую Zendesk Support SDK for Android и пытаюсь сделать так...

122
Получить TAG элемента listView

Получить TAG элемента listView

Добрый деньЕсть ListView в котором два TextView у каждого из которых свой тег

192