2016-03-19 5 views
5

मैं जावा में HashMap स्रोत कोड का विश्लेषण करता हूं और put विधि के बारे में एक प्रश्न प्राप्त करता हूं।हैश मैप.पूट दोनों हैश और टेस्ट समानता की तुलना क्यों करता है?

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

    modCount++; 
    addEntry(hash, key, value, i); 
    return null; 
} 

मैं if (e.hash == hash && ((k = e.key) == key || key.equals(k)))

क्यों इस तरह की स्थिति है के बारे में भ्रमित हो:

नीचे JDK1.6 में put विधि है?

तो दो वस्तुओं बराबरी के अनुसार बराबर हैं (वस्तु) विधि, तो दो में से प्रत्येक पर hashCode विधि बुला:

क्योंकि जावा सुपर वर्ग Object में, वहाँ hashCode और equals के contract है वस्तुओं को एक ही पूर्णांक परिणाम उत्पन्न करना चाहिए।

तो key.equals(k) का अर्थ key.hashCode() == k.hashCode() है।

hash() नीचे है:

static int hash(int h) { 
    // This function ensures that hashCodes that differ only by 
    // constant multiples at each bit position have a bounded 
    // number of collisions (approximately 8 at default load factor). 
    h ^= (h >>> 20)^(h >>> 12); 
    return h^(h >>> 7)^(h >>> 4); 
} 

इस प्रकार key.hashCode() == k.hashCode() तात्पर्य e.hash == hash

तो if ((k = e.key) == key || key.equals(k)) जैसी स्थिति क्यों नहीं है?

उत्तर

6

यह सिर्फ एक विधि कॉल से परहेज है यह कर सकते हैं जब: अगर हैश प्रविष्टि के हैश से अलग है (जो नहीं hashCode() है, यह नक्शा के अपने हैशिंग है), यह जानता है कि यह कम से equals कॉल करने के लिए नहीं है सब। थोड़ा सा अनुकूलित करना।

6

यह सिर्फ एक अनुकूलन है: दो पूर्णांक की तुलना equals() पर कॉल करने से तेज है।

यदि दो हैशकोड भिन्न हैं, तो equals और hashCode के अनुबंध के आधार पर, नक्शा जानता है कि मौजूदा कुंजी दी गई कुंजी के बराबर नहीं है, और अगले के लिए तेज़ी से जा सकती है।

1

'हैश' चर का मान कुंजी हैशकोड से अलग हो सकता है। 'हैश' चर 'हैश (key.hashCode())' विधि को कॉल करने का परिणाम है। इसलिए इसे हैश मानों और चाबियों की समानता की तुलना करने की आवश्यकता है।

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