HashMap'teki çakışmalar hakkında bilgi verin.
sobes.tech yapay zeka
AI'dan gelen yanıt
HashMap içinde çakışma, iki farklı anahtarın aynı hash koduna sahip olması durumunda oluşur. Bu, veri kaybına yol açmaz, ancak performansı etkiler.
Bir öğe eklerken:
- Anahtarın
hashCode()yöntemi çağrılır. - Hash koduna göre dizideki bucket'ın indeksi hesaplanır.
- Eğer bucket boşsa, öğe eklenir.
- Eğer bucket zaten öğeler içeriyorsa, her öğe için
equals()çağrılır. - Eğer
equals()truedönerse, değer güncellenir. - Eğer
equals()her zamanfalsedönerse, yeni öğe bucket'a eklenir.
Android 7.0 (Nougat) öncesinde, HashMap çakışmaları çözmek için bağlı listeler kullanıyordu. Bir buckette çok sayıda çakışma varsa, bağlı listedeki arama O(n) zaman alır, burada n bucketteki öğe sayısıdır.
Android 7.0 ve sonrası, çok sayıda çakışma (eşik 8 öğe) olan bucketlar için HashMap otomatik olarak bağlı listeyi kırmızı-siyah ağaca (TreeNode) dönüştürür. Ağacın içinde arama O(log n) zaman alır, bu da performansı önemli ölçüde artırır. Eğer bucketteki öğe sayısı tekrar eşikten (6 öğe) azalsa, ağaç tekrar bağlı listeye dönüştürülür.
Kullanıcı tanımlı nesneler için iyi bir hashCode() ve equals() uygulaması, çakışmaları en aza indirir ve HashMap'in etkinliğini sağlar.
Örnek:
@Override
public int hashCode() {
// İyi bir hashCode uygulaması örneği
int result = 17;
result = 31 * result + field1.hashCode();
result = 31 * result + field2;
return result;
}
@Override
public boolean equals(Object o) {
// Doğru bir equals uygulaması örneği
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObject myObject = (MyObject) o;
return field2 == myObject.field2 &&
field1.equals(myObject.field1);
}