मैं जावा में 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))
जैसी स्थिति क्यों नहीं है?