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, защото ключът "изчезна"