2016-10-14 41 views
5

Aşağıda, Java 7'nin HashMap uygulamasının (get() yöntemi) kaynak kodu verilmiştir. Görebildiğiniz gibi, get yönteminde, anahtarları karşılaştırırken, anahtar listesindeki anahtarın aranıp aranmadığını belirlemek için her iki anahtarın 'hashcodes ve keys' değerlerini karşılaştırır. Bununla birlikte, eğer iki anahtar aynıysa, elbette ki, aynı karekoduna sahip olacaklardır ve eğer iki anahtar farklıysa, anahtarların değerlerini karşılaştırmak onları ayırmak için yeterlidir. Peki, neden Java HashMap kaynak kodu, anahtarların 'karma kodları' eşitliği ile ilgileniyor?hashmap anahtarının karşılaştırması, neden hem anahtarın hashcode değerini hem de anahtarın değerini karşılaştırıyoruz

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

cevap

8

Test == ile int eşitlik için karmaşık bir nesne üzerinde equals çağırma kıyasla oldukça ucuz bir işlemdir. Karmaların eşitliği bir kısayoldur. Anahtar hiç değilse, karma eşit olmaz ve false döndüren nispeten hızlı bir ==, maliyetli bir equals işleminin (kısa devre mantığı sayesinde) çalışmasını kaydeder. Anahtar oradaysa, sadece bir başka hızlı eşitliği "harcadınız".