Sobes.tech
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