Sobes.tech
Junior — Middle

Ako zmena kľúča ovplyvňuje štruktúru a správanie HashMap v Jave?

sobes.tech AI

Odpoveď od AI

V HashMap sa klúčmi sa používajú na výpočet hash kódu a určenie pozície prvku vnútornej štruktúry (bucket). Ak sa objekt používaný ako kľúč zmení tak, že sa zmení jeho hash kód alebo výsledok metódy equals(), naruší to správne fungovanie HashMap.

Prečo?

  • Pri pridávaní prvku sa kľúč hash-uje a prvok sa umiestni do určitého bucketu.
  • Pri hľadaní prvku podľa kľúča HashMap vypočíta hash a hľadá v príslušnom bucketu.

Ak sa kľúč po pridaní zmení, pri hľadaní s novým stavom kľúča sa vypočíta iný hash a prvok nebude nájdený — "stratí" sa v mape.

Preto by mali byť kľúče v HashMap nemenné (immutable) alebo sa nemajú meniť, kým sa používajú ako kľúče.

Príklad problému:

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, "hodnota");

key.id = 2; // zmena kľúča

System.out.println(map.get(key)); // null, pretože kľúč "zmizol"