2014-11-14 8 views
7

Java doc says तक पहुंचने पर नहीं बढ़ाई - हैश तालिका में प्रविष्टियों की संख्या लोड फैक्टर और वर्तमान क्षमता के उत्पाद से अधिक हो गया है, हैश तालिकाHashMap क्षमता भी सीमा

rehashed है नीचे कार्यक्रम में -

HashMap<Integer, String> map = new HashMap<Integer, String>(); 
int i = 1; 
while(i<16) { 
    map.put(i, new Integer(i).toString()); 
    i++; 
} 

कुंजी, के प्रकार के पूर्णांक है 15 वीं तत्व HashMap क्षमता को 13 वीं की प्रविष्टि पर 16 के रूप में बनी हुई है और सीमा 12 के रूप में एक ही रहता है, क्यों? HashMap<String, String> या एक कस्टम वर्ग - -

args     String[0] (id=16) 
map HashMap<K,V> (id=19) 
entrySet null 
hashSeed 0 
KeySet  null 
loadFactor 0.75 
modCount 13 
size  13 
table  HashMap$Entry<K,V>[16] (id=25) 
threshold 12 
values  null 
i 14 

[null, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9, 10=10, 11=11, 12=12, 13=13, null, null] 

प्रकार स्ट्रिंग की कुंजी के साथ HashMap -

+3

कोड पढ़ें। यह समझाएगा। यह संभव है कि कार्यान्वयन में कुछ बदल गया है जिसका अर्थ है कि जावाडोक अब * बिल्कुल सही नहीं है। लेकिन यह दिलचस्प नहीं है (आईएमओ) क्योंकि कोई समझदार प्रोग्रामर कभी भी हैशप आकार बदलने के सटीक व्यवहार पर निर्भर नहीं होगा। –

+1

सिर्फ यह जानने का प्रयास कर रहा है कि एंटीजर के रूप में कुंजी रखने के लिए कार्यान्वयन व्यवहार अलग क्यों है। यदि मैं हैश मैप <स्ट्रिंग, स्ट्रिंग> का प्रयास करता हूं तो यह 13 वें प्रविष्टि – anmolmore

+0

पर मानचित्र का आकार बदलता है जो जावा संस्करण (अपडेट सहित)? – m3th0dman

उत्तर

5

लग रहा है 13 वीं प्रविष्टि पर Map<Employee,Integer> शो अपेक्षित व्यवहार इस व्यवहार की तरह कारण है

डीबग स्क्रीनशॉट नक्शे में 13 वें तत्व जोड़ने के बाद जावा 7 के हाल के संस्करण में हैश मैप पीयूटी विधि के आंतरिक कार्यान्वयन में बदलने के लिए। कई संस्करणों के स्रोत कोड के माध्यम से जाने के बाद, मेरे प्रश्न

हैशमा

public V put(K key, V value) { 
    ... 
    int hash = hash(key); 
    int i = indexFor(hash, table.length); 
    ... 
    addEntry(hash, key, value, i); 
    ... 
} 

jdk7-b147 HashMap.addEntry विधि की तरह दिखता है - - पी डाल विधि addEntry() एक नई प्रविष्टि जोड़ने के लिए कॉल

addEntry(int hash, K key, V value, int bucketIndex) { 
    Entry<K,V> e = table[bucketIndex]; 
    table[bucketIndex] = new Entry<>(hash, key, value, e); 
    if (size++ >= threshold) 
     resize(2 * table.length); 
} 

स्रोत संस्करण 1.7.0_67-B01 के कोड लगता है कि -

void addEntry(int hash, K key, V value, int bucketIndex) { 
    if ((size >= threshold) && (null != table[bucketIndex])) { 
     resize(2 * table.length); 
     hash = (null != key) ? hash(key) : 0; 
     bucketIndex = indexFor(hash, table.length); 
    } 
    createEntry(hash, key, value, bucketIndex); 
} 

तो, जावा के हाल के संस्करणों में, हैश मैप को अकेले थ्रेसहोल्ड के आधार पर आकार में नहीं बदला जा सकता है। तो बाल्टी खाली है प्रविष्टि अभी भी आकार बदलने HashMap

बिना में जाना होगा जावा 8 अलग व्यवहार कर सकती, source code of version 8-b132 से पता चलता PUT पूरी तरह से लागू किया फिर रहा है -

put(K key, V value) { 
    return putVal(hash(key), key, value, false, true); 
} 

putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) { 
    Node<K,V>[] tab; Node<K,V> p; int n, i; 
    if ((tab = table) == null || (n = tab.length) == 0) 
    n = (tab = resize()).length; 
    .... 
} 

final Node<K,V>[] resize() { 
    //many levels of checks before resizing 
} 

जावा दस्तावेज़ जावा संस्करणों के रूप में के रूप में अक्सर अद्यतन नहीं किया जा सकता! धन्यवाद स्टीफन

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