Sobes.tech
Junior — Middle

Как влияе промяната на ключа върху структурата и поведението на HashMap в Java?

sobes.tech AI

Отговор от AI

В HashMap ключовете се използват за изчисляване на хеш-кода и определяне на позицията на елемента във вътрешната структура (бакет). Ако обектът, използван като ключ, бъде променен по такъв начин, че да се промени неговият хеш-код или резултатът от метода equals(), това ще наруши работата на HashMap.

Защо?

  • При добавяне на елемент, ключът се хешира и елементът се поставя в определен бакет.
  • При търсене на елемент по ключ, HashMap изчислява хеша и търси в съответния бакет.

Ако ключът се промени след добавянето, при търсене с новото му състояние ще се изчисли различен хеш и елементът няма да бъде намерен — той "изчезва" в картата.

Затова ключовете в HashMap трябва да бъдат непроменяеми (immutable) или да не се променят, докато се използват като ключове.

Пример за проблем:

class Key {
    int id;
    Key(int id) { this.id = id; }
    public int hashCode() { return id; }
    public boolean equals(Object o) { return o instanceof Key && ((Key)o).id == id; }
}

Key key = new Key(1);
HashMap<Key, String> map = new HashMap<>();
map.put(key, "стойност");

key.id = 2; // променен ключ

System.out.println(map.get(key)); // null, защото ключът "изчезна"