Sobes.tech
Middle

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:

  1. Anahtarın hashCode() yöntemi çağrılır.
  2. Hash koduna göre dizideki bucket'ın indeksi hesaplanır.
  3. Eğer bucket boşsa, öğe eklenir.
  4. Eğer bucket zaten öğeler içeriyorsa, her öğe için equals() çağrılır.
  5. Eğer equals() true dönerse, değer güncellenir.
  6. Eğer equals() her zaman false dö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);
}