В чем будет проблема, если не переопределять метод hashCode()

Некоторые коллекции, такие как HashSet, HashMap или HashTable, используют значение хэш-кода объекта, чтобы узнать, как объект будет храниться в коллекции, и впоследствии хэш-код используется, чтобы помочь найти объект в коллекции. Извлечение хэша участвует:

  • Во-первых, в поиске нужного бакета (корзины) с помощью hashCode()
  • Во-вторых, в поиске в корзине нужного элемента, используя equals()

Если hashCode() не переопределен, то реализация по умолчанию в классе Object будет использоваться коллекциями. Эта реализация дает разные значения для разных объектов, даже если они равны согласно методу equals().

Пример:

public class Person {
    private int id;
    private String name;
    public Person(int id, String name) {
        this.name = name;
        this.id = id;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

public class HashcodeEquals {
    public static void main(String[] args) {
        Person bob1 = new Person(1, "Bob");
        Person bob2 = new Person(1, "Bob");
        System.out.println("bob1 hashcode = " + bob1.hashCode());
        System.out.println("bob2 hashcode = " + bob2.hashCode());
        System.out.println("Проверка равенства bob1 and bob2 = " + bob1.equals(bob2));
    }
}

Вывод:

bob1 hashcode = 1852704110
bob2 hashcode = 2032578917
Проверка равенства bob1 and bob2 = false


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки