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