Назад к вопросам
Middle
443
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

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")); // Поиск будет медленным