Проверка равенства строк: значение против ссылки

Первая строка вывода содержит true, вторая false. S1 и s2 используют один интернированный литерал, а s3 ссылается на новый объект.

Короткий ответ

Что ответить на собеседовании

Первая строка вывода содержит true, вторая false. S1 и s2 используют один интернированный литерал, а s3 ссылается на новый объект.

Подробный разбор

Ответ с пояснениями

Условие

В этом примере демонстрируется, как работает оператор == при сравнении строк, созданных разными способами – как литералы и через конструктор new String. Вывод покажет, совпадают ли ссылки на объекты в памяти.

public static void main(String[] args) {
    var s1 = "a";
    var s2 = "a";
    var s3 = new String("a");

    System.out.println("s1 == s2: " + (s1 == s2));
    System.out.println("s1 == s3: " + (s1 == s3));
}

Ответ

Первая строка вывода содержит true, вторая false. S1 и s2 используют один интернированный литерал, а s3 ссылается на новый объект.

s1 == s2: true
s1 == s3: false

Содержимое всех трёх строк одинаково. Для сравнения текста s1.equals(s3) вернёт true; оператор == не выполняет такого сравнения. Var лишь выводит тип String на этапе компиляции. Для строк с возможным null можно использовать Objects.equals, чтобы не получить NullPointerException при вызове метода на отсутствующей ссылке.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее