Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: Java, String, equals, string pool, reference comparison

Почему equals() для строк может возвращать true при разных ссылках?

Вопрос проверяет понимание различий между сравнением строк по ссылке и по значению в Java, а также знание работы метода equals() и пула строк.

Короткий ответ

Метод equals() в Java сравнивает содержимое строк, а не ссылки на объекты. Две разные строки, созданные разными способами, могут иметь одинаковую последовательность символов. В этом случае equals() вернет true, даже если оператор == (сравнение ссылок) вернет false. Например, строки, созданные через new String("text") и литерал "text", будут равны по equals(), но это разные объекты в памяти.

Длинный ответ

В Java строки (String) являются объектами. Сравнение объектов с помощью оператора == проверяет, ссылаются ли две переменные на один и тот же объект в памяти. Однако часто нам нужно сравнить логическое содержимое строк — одинаковые ли в них символы. Для этого используется метод equals(), который переопределен в классе String для посимвольного сравнения.

Как работает equals() для строк

Метод String.equals() сравнивает длину строк и каждый символ в последовательности. Если все символы совпадают, метод возвращает true, даже если объекты находятся по разным адресам в памяти (heap). Это фундаментальное отличие от сравнения по ссылке.

Примеры и пул строк

Java для оптимизации использует пул строк (String Pool). Когда строка создается через литерал (например, "hello"), JVM сначала ищет ее в пуле. Если находит, возвращает ссылку на существующий объект. Это может приводить к тому, что == для двух литералов вернет true. Однако при явном создании через new String() всегда создается новый объект вне пула.

String literal1 = "hello";
String literal2 = "hello";
String newString = new String("hello");

System.out.println(literal1 == literal2);      // true (одна ссылка из пула)
System.out.println(literal1.equals(literal2)); // true (одинаковое содержимое)
System.out.println(literal1 == newString);     // false (разные объекты)
System.out.println(literal1.equals(newString)); // true (содержимое одинаково)

Где это применяется

Понимание этой разницы критично при работе с коллекциями (например, HashMap, где ключами являются строки), при сравнении пользовательского ввода, чтении данных из файлов или сетевых потоков. Всегда используйте equals() для сравнения строк по значению, если только вы намеренно не проверяете, что это один и тот же объект (что бывает редко).

Вывод: Метод equals() возвращает true для строк с одинаковым содержимым, даже если это разные объекты. Это основное поведение для логического сравнения строк в Java, в то время как == сравнивает идентичность объектов. Всегда используйте equals() для сравнения строковых значений.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Java

    Java

Ключевые слова

#Java

#String

#equals

#string pool

#reference comparison

Подпишись на Java Developer в телеграм