Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Справочник Java

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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.