जैसा कि कुछ भ्रम है कि कौन सा एल्गोरिथ्म जावा के हैशपॉप का उपयोग कर रहा है (सूर्य / ओरेकल / ओपनजेडके कार्यान्वयन में), यहां प्रासंगिक स्रोत कोड स्निपेट्स (ओपेनजेडके, 1.6.0_20, उबंटू से):
/**
* Returns the entry associated with the specified key in the
* HashMap. Returns null if the HashMap contains no mapping
* for the key.
*/
final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : 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 != null && key.equals(k))))
return e;
}
return null;
}
यह विधि (पंक्तियों 355 से 371 तक है) को कहा जाता है जब तालिका में प्रविष्टि की तलाश की जाती है, उदाहरण के लिए get()
, containsKey()
और कुछ अन्य। यहां लूप के लिए प्रविष्टि ऑब्जेक्ट्स द्वारा बनाई गई लिंक की गई सूची से गुजरती है।
यहाँ प्रविष्टि ऑब्जेक्ट्स के लिए कोड (लाइनें 691-705 + 759):
static class Entry<K,V> implements Map.Entry<K,V> {
final K key;
V value;
Entry<K,V> next;
final int hash;
/**
* Creates new entry.
*/
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
// (methods left away, they are straight-forward implementations of Map.Entry)
}
इसके ठीक बाद addEntry()
विधि आती है :
/**
* Adds a new entry with the specified key, value and hash code to
* the specified bucket. It is the responsibility of this
* method to resize the table if appropriate.
*
* Subclass overrides this to alter the behavior of put method.
*/
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
यह पुरानी पहली प्रविष्टि (या अशक्त, यदि ऐसा नहीं है) के लिंक के साथ, बाल्टी के मोर्चे पर नई प्रविष्टि जोड़ता है । इसी तरह,removeEntryForKey()
विधि सूची के माध्यम से जाती है और केवल एक प्रविष्टि को हटाने का ख्याल रखती है, जिससे बाकी सूची बरकरार रहती है।
इसलिए, यहां प्रत्येक बाल्टी के लिए एक लिंक प्रविष्टि सूची है, और मुझे बहुत संदेह है कि यह इस से बदल _20
गया _22
, क्योंकि यह 1.2 पर इस तरह से था।
(यह कोड 1997-2007 सन माइक्रोसिस्टम्स है, और जीपीएल के तहत उपलब्ध है, लेकिन कॉपी करने के लिए बेहतर है कि मूल फ़ाइल का उपयोग करें, जो सूर्य / ओरेकल से प्रत्येक JDK में src.zip में निहित है, और OpenJDK में भी है।)