Middle
HashMap barcha qo'shilayotgan kalitlar bir xil hashCode() ga ega bo'lsa ishlaydimi?
sobes.tech AI
AIdan javob
Ha, bo'ladi.
Agar hashCode() bir xil bo'lsa, barcha elementlar HashMap ichida bir xil "qutiga" (bucket) tushadi. Bu HashMapning zanjirli ro'yxatga (yoki daraxtga, agar elementlar etarlicha ko'p bo'lsa va Java 8+ bilan TreeNode ishlatilsa) aylanishiga olib keladi, bu esa put(), get(), remove() operatsiyalarining ishlashini o'rtacha O(n) ga, o'rniga O(1) ga sezilarli darajada yomonlashtiradi.
Shuning uchun, HashMap to'g'ri ishlaydi, ammo hash to'qnashuvlari sababli uning asosiy tezlik afzalligi yo'qoladi. Bir xil hashga ega obyektlarni ajratish uchun equals() metodidan foydalaniladi.
class BadHashKey {
private String name;
public BadHashKey(String name) {
this.name = name;
}
@Override
public int hashCode() {
return 1; // Har doim bir xil hash kodini qaytaradi
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BadHashKey that = (BadHashKey) o;
return name.equals(that.name); // Nomi bo'yicha tenglikni tekshiradi
}
@Override
public String toString() {
return "BadHashKey{" +
"name='" + name + '\'' +
'}';
}
}
// Foydalanish misoli
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Ikkala kalit ham bir xil qutiga tushadi
// String value = map.get(new BadHashKey("key1")); // Qidiruv sekin bo'ladi