Object.hashCode()
Возвращает хеш-код объекта — число, по которому HashMap и HashSet быстро находят объект.
Доступно с: Java 1.0
Синтаксис
public int hashCode()Возвращаемое значение
intЦелое число. У равных по equals() объектов оно обязано совпадать.
Примеры
У равных строк и записей хеш-коды совпадают:
record Point(int x, int y) {}
void main() {
IO.println("abc".hashCode());
IO.println("abc".hashCode() == new String("abc").hashCode());
IO.println(new Point(1, 2).hashCode() == new Point(1, 2).hashCode());
}Результат:
96354
true
trueЧто бывает, если переопределить только equals():
class Tag {
final String name;
Tag(String name) { this.name = name; }
@Override
public boolean equals(Object o) {
return o instanceof Tag t && t.name.equals(name);
}
}
void main() {
Set<Tag> tags = new HashSet<>();
tags.add(new Tag("java"));
IO.println(tags.contains(new Tag("java")));
}Результат:
falseПримечания
Контракт: если a.equals(b), то a.hashCode() == b.hashCode(). Обратное не обязательно — разные объекты могут иметь одинаковый хеш. В примере выше contains() вернул false, потому что хеш-коды двух равных объектов разные и HashSet ищет не в той «корзине». Проще всего считать хеш через Objects.hash(поля...).
См. также
- Object.equals() — Сравнивает объекты по смыслу. По умолчанию работает как ==, поэтому в своих классах его переопределяют.
- Objects.hash() — Вычисляет хеш-код из нескольких значений — для реализации hashCode().
- record — Объявляет запись — неизменяемый класс для хранения данных с готовыми equals(), hashCode() и toString().
Вопросы и ответы по теме
В учебнике
- Равенство и хеш-коды — Сравнение объектов в Java — == и equals, контракт equals и hashCode, Objects.equals и Objects.hash, записи и ошибка с HashSet.