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