2013-11-26 8 views
7

मैंने पाया कि कुछ कोड के लिए शून्य कोड क्लास हैश मैप में जेडीके 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 की अशक्त कुंजी तंत्र परिवर्तन का लाभ?

+1

यह प्रश्न ऑफ-विषय प्रतीत होता है क्योंकि यह प्रोग्रामर से संबंधित है .stackexchange.com –

उत्तर

2

Documentation for private V getForNullKey()

प्राप्त की उतारा संस्करण (शून्य कुंजी को देखने के लिए) कहते हैं। नल कुंजी इंडेक्स 0 पर नक्शा करें। यह शून्य मामला के लिए दो सबसे आम तौर पर प्रयुक्त संचालन (प्राप्त करें और डाल) में प्रदर्शन के लिए अलग-अलग तरीकों से विभाजित किया गया है, लेकिन दूसरों में सशर्त के साथ शामिल किया गया है।

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