Sobes.tech
Back to questions
Middle
558
questionbank

Будет ли работать HashMap, если все добавляемые ключи имеют одинаковый hashCode()?

Sobes Copilot

Get answers in real time

Answer from AI

sobes.tech AI

Да, будет.

При одинаковом hashCode() все элементы будут попадать в одну "корзину" (bucket) в HashMap. Это приведет к вырождению HashMap в связанный список (или дерево, если элементов достаточно много и используется Java 8+ с TreeNode), что значительно ухудшит производительность операций put(), get(), remove() до O(n) вместо O(1) в среднем случае.

Таким образом, HashMap будет корректно функционировать, но потеряет свое главное преимущество в скорости из-за коллизий хешей. Для различения объектов с одинаковым хешем используется метод equals().

class BadHashKey {
    private String name;

    public BadHashKey(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return 1; // Всегда возвращаем один и тот же хеш-код
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BadHashKey that = (BadHashKey) o;
        return name.equals(that.name); // Проверяем на равенство по имени
    }

    @Override
    public String toString() {
        return "BadHashKey{" +
               "name='" + name + '\'' +
               '}';
    }
}

// Пример использования
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Оба ключа будут в одной корзине
// String value = map.get(new BadHashKey("key1")); // Поиск будет медленным