मैंने पाया कि कुछ कोड के लिए शून्य कोड क्लास हैश मैप में जेडीके 1.6 या उससे ऊपर संस्करण में पिछले जेडीके संस्करण की तुलना में 1.5 की तरह बदल गया है।जेडीके 1.6 या उससे ऊपर संस्करण में हैश मैप के नल कुंजी तंत्र परिवर्तन का क्या फायदा है?
JDK1.5 में, एक स्थिर अंतिम वस्तु NULL_KEY परिभाषित किया गया है नामित: स्थिर अंतिम वस्तु NULL_KEY = नई वस्तु();
तरीके, maskNull
, unmaskNull
, get
और put
आदि सहित, इस वस्तु का उपयोग करेगा।
static final Object NULL_KEY = new Object();
static <T> T maskNull(T key) {
return key == null ? (T)NULL_KEY : key;
}
static <T> T unmaskNull(T key) {
return (key == NULL_KEY ? null : key);
}
public V get(Object key) {
Object k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
Entry<K,V> e = table[i];
while (true) {
if (e == null)
return null;
if (e.hash == hash && eq(k, e.key))
return e.value;
e = e.next;
}
}
public V put(K key, V value) {
K k = maskNull(key);
int hash = hash(k);
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
if (e.hash == hash && eq(k, e.key)) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, k, value, i);
return null;
}
हालांकि, इस तरह वस्तु (NULL_KEY) JDK 1.6 में या संस्करण से ऊपर नहीं किया जाता है देखें।
इसके बजाय, दो नए तरीकों getForNullKey()
और putForNullKey(value)
जोड़ा जाता है, जो रूप में अच्छी तरह get
और put
विधि अपनाई जाती हैं नाम दिया है।
इस प्रकार स्रोत कोड देखें: इस तरह के improving the performance
आदि के रूप में,
public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key);
return null == entry ? null : entry.getValue();
}
private V getForNullKey() {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null)
return e.value;
}
return null;
}
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key);
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;
}
/**
* Offloaded version of put for null keys
*/
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
बदलें हमेशा बदल के लिए अपने कारण है कृपया मुझे निम्नलिखित 2 प्रश्न के साथ मदद कर बाहर
क्यू # 1 == >यह परिवर्तन क्यों किया जाता है, क्या कोई परिदृश्य है कि हैश मैप की नल कुंजी जेडीके 1.5 एन्कॉन्टर मुद्दे में लागू की गई है?
क्यू # 2 ==>क्या है JDK 1.6 में या संस्करण से ऊपर HashMap की अशक्त कुंजी तंत्र परिवर्तन का लाभ?
यह प्रश्न ऑफ-विषय प्रतीत होता है क्योंकि यह प्रोग्रामर से संबंधित है .stackexchange.com –