Sobes.tech
Junior — Middle

Kako promena ključa utiče na strukturu i ponašanje HashMap u Javi?

sobes.tech АИ

Одговор од АИ

U HashMap-u, ključevi se koriste za izračunavanje hash-koda i određivanje pozicije elementa u unutrašnjoj strukturi (bucket). Ako objekat koji se koristi kao ključ bude izmenjen tako da se promeni njegov hash-kod ili rezultat metode equals(), to će narušiti rad HashMap.

Zašto?

  • Pri dodavanju elementa, ključ se hash-uje i element se smešta u određeni bucket.
  • Pri pretraživanju elementa po ključu, HashMap izračunava hash i traži u odgovarajućem bucket-u.

Ako se ključ promeni nakon dodavanja, pri pretraživanju sa novim stanjem ključa biće izračunat drugačiji hash i element neće biti pronađen — on će "nestati" u mapi.

Zato, ključevi u HashMap treba da budu nepromenljivi (immutable) ili da se ne menjaju dok se koriste kao ključevi.

Primer problema:

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

key.id = 2; // promena ključa

System.out.println(map.get(key)); // null, jer je ključ "nestao"