Что вернут сравнения для new String("a") и new String("a") через == и через equals()?
- Чем == отличается от equals для строк?
- Почему строки нельзя сравнивать через ==?
- Что такое string pool?
== даст false, equals() — true: == сравнивает ссылки, equals() у String — содержимое.
new String("a")всегда создаёт новый объект в куче- Литералы
"a"берутся из string pool, поэтому"a" == "a"бывает true
А ещё Строки всегда сравнивают через equals()
Подробно
Для объектов оператор == проверяет, указывают ли две ссылки на один и тот же объект. new String("a") каждый раз создаёт новый объект, поэтому две такие строки — разные объекты, и == возвращает false.
String.equals() переопределён и сравнивает строки посимвольно — для одинакового текста результат true.
Путаницу создаёт пул строк (string pool): строковые литералы хранятся в нём в одном экземпляре, поэтому "a" == "a" даёт true. Метод intern() позволяет явно получить строку из пула. Но рассчитывать на это в коде нельзя: строка, пришедшая из сети, файла или конкатенации во время выполнения, будет отдельным объектом. Правило простое — содержимое строк сравнивают через equals(), а для нечувствительного к регистру сравнения — equalsIgnoreCase().
Пример
String a = new String("a");
String b = new String("a");
System.out.println(a == b); // false — разные объекты
System.out.println(a.equals(b)); // true — одинаковое содержимое
System.out.println("a" == "a"); // true — один литерал из пула
System.out.println(a.intern() == "a"); // trueЧто хотят услышать
==→ false,equals()→ true, с объяснением почему.- Разница между сравнением ссылок и содержимого.
- Понимание пула строк и почему литералы ведут себя иначе.
- Правило: строки сравнивать через
equals().
Частые ошибки
- Считать, что == всегда сравнивает содержимое.
- Забывать про string pool для литералов.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗== вернёт true, equals() вернёт true
- ✓== вернёт false, equals() вернёт true
- ✗== вернёт false, equals() вернёт false
- ✗== вернёт true, equals() вернёт false
Что спросят дальше
- Что такое string pool и как работает intern()?
- Как связаны equals() и hashCode()?
Разбор темы
- Равенство: ==, equals и hashCode
Идентичность против логического равенства, контракт equals и hashCode, проблема equals с наследованием и корректная реализация.
- Строки: неизменяемость, пул и StringBuilder
Почему String immutable, String pool и intern, конкатенация и StringBuilder, char/code points и compact strings.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.