Сравнение ссылок строковых литералов и объектов в Java

Программа напечатает a == b: true и a == c: false. Имена в строковых подписях не совпадают с переменными x/y/z, но это не влияет на сами сравнения.

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

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

Программа напечатает a == b: true и a == c: false. Имена в строковых подписях не совпадают с переменными x/y/z, но это не влияет на сами сравнения.

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

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

Условие

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

public class Test1 {
    public static void main(String[] args) {
        var x = "a";
        var y = "a";
        var z = new String("a");

        System.out.println("a == b: " + (x == y));
        System.out.println("a == c: " + (x == z));
    }
}

Ответ

Программа напечатает a == b: true и a == c: false. Имена в строковых подписях не совпадают с переменными x/y/z, но это не влияет на сами сравнения.

X и y указывают на один интернированный литерал "a". New String("a") создаёт отдельный объект, поэтому x == z ложно. Равенство содержимого во всех парах истинно и проверяется через String.equals. Не стоит объяснять это буквальным расположением «в разных участках памяти»: для Java существенна идентичность объектов, а не доступные программисту физические адреса.

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

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

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

Подробнее