Sobes.tech
Middle

Əlavə olunan bütün açarların eyni hashCode()-a malik olduğu halda HashMap işləyəcəkmi?

sobes.tech Süni İntellekt

AI-dan cavab

Bəli, olacaq.

Eyni hashCode() ilə, bütün elementlər HashMap-də eyni "kova"ya (bucket) düşəcək. Bu, HashMap-in zəncirli siyahıya (və ya ağaca, əgər kifayət qədər element varsa və Java 8+ ilə TreeNode istifadə olunursa) çevrilməsinə səbəb olacaq və bu, put(), get(), remove() əməliyyatlarının performansını orta hesabla O(n) qədər pisləşdirəcək, əvəzinə O(1).

Beləliklə, HashMap düzgün işləyəcək, lakin hash toqquşmaları səbəbindən onun əsas sürət üstünlüyünü itirəcək. Eyni hash-ə malik obyektləri ayırmaq üçün equals() metodu istifadə olunur.

class BadHashKey {
    private String name;

    public BadHashKey(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return 1; // Hər zaman eyni hash kodunu qaytarır
    }

    @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); // Ad ilə bərabərliyi yoxlayır
    }

    @Override
    public String toString() {
        return "BadHashKey{" +
               "name='" + name + '\'' +
               '}';
    }
}

// İstifadə nümunəsi
// Map<BadHashKey, String> map = new HashMap<>();
// map.put(new BadHashKey("key1"), "value1");
// map.put(new BadHashKey("key2"), "value2"); // Hər iki açar eyni kovada olacaq
// String value = map.get(new BadHashKey("key1")); // Axtarış yavaş olacaq