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
HashMapvypočí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"