Первая строка вывода содержит 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 при вызове метода на отсутствующей ссылке.