2016-10-14 12 views
5

नीचे जावा 7 के HashMap कार्यान्वयन (get() विधि) का स्रोत कोड है। जैसा कि आप देख सकते हैं, प्राप्त विधि में, कुंजी की तुलना करते समय, यह निर्धारित करने के लिए कि क्या लिंक्डलिस्ट में प्रविष्टि कुंजी खोज रही है, दोनों कुंजी 'हैशकोड्स और चाबियों' मानों की तुलना करता है। हालांकि, मुझे लगता है कि यदि दो कुंजियां समान हैं, तो निश्चित रूप से उनके पास एक ही हैशकोड होगा, और यदि दो कुंजी अलग हैं, तो चाबियों के मानों की तुलना करना उन्हें अलग करने के लिए पर्याप्त है। तो कुंजी 'हैशकोड की समानता के बारे में जावा HashMap स्रोत कोड देखभाल क्यों करती है?हैशपैप कुंजी की तुलना, दोनों कुंजी के हैशकोड और कुंजी के मूल्य की तुलना करें

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; 
} 

उत्तर

8

== साथ int समानता के लिए परीक्षण एक जटिल वस्तु पर equals लागू की तुलना में एक काफी सस्ते ऑपरेशन है। हैश की समानता एक शॉर्टकट है। यदि कुंजी बिल्कुल नहीं है, तो हैश बराबर नहीं होंगे, और अपेक्षाकृत तेज़ == जो false लौटाता है, एक महंगा equals ऑपरेशन (शॉर्ट सर्किट तर्क के लिए धन्यवाद) को सहेजने से बचाएगा। यदि कुंजी वहां है, तो आपने बस एक और त्वरित समानता को "बर्बाद" कर दिया है।

संबंधित मुद्दे