Получить доступ

Что вернут сравнения для new String("a") и new String("a") через == и через equals()?

JuniorОсновы языка
Ещё спрашивают так:
  • Чем == отличается от equals для строк?
  • Почему строки нельзя сравнивать через ==?
  • Что такое string pool?
Коротко

== даст false, equals() — true: == сравнивает ссылки, equals() у String — содержимое.

  • new String("a") всегда создаёт новый объект в куче
  • Литералы "a" берутся из string pool, поэтому "a" == "a" бывает true

А ещё Строки всегда сравнивают через equals()

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Для объектов оператор == проверяет, указывают ли две ссылки на один и тот же объект. 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()?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем