Программа напечатает a == b: true и a == c: false. Имена в строковых подписях не совпадают с переменными x/y/z, но это не влияет на сами сравнения.
Сравнение ссылок строковых литералов и объектов в Java
Программа напечатает 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 существенна идентичность объектов, а не доступные программисту физические адреса.