Почему в Java нельзя сравнивать строки через оператор ==?

«Почему в Java нельзя сравнивать строки через оператор ==?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор == в Java сравнивает ссылки на объекты, а не их содержимое. Для строк это означает, что == проверяет, указывают ли обе переменные на один и тот же объект в памяти, а не на идентичные последовательности символов.

Почему equals(), а не ==?

  • Строки (String) — это объекты.
  • Даже строки с одинаковым текстом могут быть разными объектами в памяти (особенно при использовании конструктора new String()).
  • Метод equals() сравнивает символьное содержимое строк.

Пример:

String s1 = new String("hello");
String s2 = new String("hello");

System.out.println(s1 == s2);      // false — разные объекты
System.out.println(s1.equals(s2)); // true  — одинаковое содержимое

Исключение (пул строк): Строковые литералы кэшируются в пуле строк (String Pool), поэтому одинаковые литералы могут ссылаться на один объект:

String s3 = "hello";
String s4 = "hello";
System.out.println(s3 == s4); // true — один объект из пула

Best practice: Всегда используйте equals() для сравнения строк по значению. Для безопасного сравнения с учётом null используйте Objects.equals(s1, s2).