Ответ
Оператор == в 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).