Sobes.tech
Junior — Middle

Hogyan befolyásolja a kulcs módosítása a HashMap szerkezetét és viselkedését Java-ban?

sobes.tech MI

Válasz az MI-től

A HashMap-ben a kulcsokat a hash-kód kiszámítására és az elem helyének meghatározására használják a belső struktúrában (bucket). Ha a kulcsként használt objektumot úgy módosítják, hogy megváltozik a hash-kódja vagy az equals() metódus eredménye, az megzavarja a HashMap működését.

Miért?

  • Elem hozzáadásakor a kulcs hash-elésre kerül, és az elem egy adott bucketbe kerül.
  • Elem keresésekor a HashMap kiszámítja a hash-t, és a megfelelő bucketben keresi.

Ha a kulcs az hozzáadás után megváltozik, akkor az új állapotban kiszámított másik hash nem fog egyezni, és az elem nem lesz megtalálható — "elveszik" a térképen.

Ezért a HashMap-ben lévő kulcsoknak nem változtathatónak (immutable) kell lenniük, vagy nem szabad megváltozniuk, amíg kulcsként használják őket.

Probléma példája:

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, "érték");

key.id = 2; // kulcs módosítva

System.out.println(map.get(key)); // null, mert a kulcs "elveszett"