Sobes.tech
Junior — Middle

Java'da HashMap ning tuzilishi va xulqiga kalitni o'zgartirish qanday ta'sir qiladi?

sobes.tech AI

AIdan javob

HashMap ichki kalitlarining hash-kodi hisoblanadi va elementning ichki tuzilmasidagi (bucket) joylashuvini aniqlash uchun ishlatiladi. Agar kalit sifatida ishlatiladigan ob'ekt uning hash-kodi yoki equals() metodining natijasini o'zgartirsa, bu HashMap ish faoliyatini buzadi.

Nima uchun?

  • Element qo'shilganda, kalit hash qilinadi va element ma'lum bir bucketga joylashtiriladi.
  • Elementni kalit bo'yicha qidirishda, HashMap hashni hisoblaydi va mos bucketda qidiradi.

Agar kalit qo'shilgandan so'ng o'zgartirilsa, yangi holatda hisoblangan hash boshqacha bo'ladi va element topilmaydi — u "yo'qoladi" xaritadan.

Shuning uchun, HashMap ichidagi kalitlar o'zgarmas (immutable) bo'lishi yoki ular kalit sifatida ishlatilganda o'zgarmasligi kerak.

Muammo misoli:

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

key.id = 2; // kalit o'zgartirildi

System.out.println(map.get(key)); // null, chunki kalit "yo'qolgan"