2013-06-24 17 views
10

में नल कुंजी के लिए हैशकोड मैं जावा में हैश मैप और हैशटेबल क्लास के बीच अंतर के बारे में पढ़ रहा था। वहां मुझे एक अंतर मिला कि पूर्व में शून्य की अनुमति है और बाद में इसके लिए विशेषाधिकार नहीं है। जहां तक ​​हैश मैप का काम चिंता है, मुझे पता है कि, यह बाल्टी खोजने के लिए हैशकोड विधि को कॉल करता है जिसमें उस महत्वपूर्ण मूल्य जोड़ी को रखा जाना है। यहां मेरा प्रश्न आता है: एक शून्य मान के लिए हैशकोड की गणना की जाती है या क्या हैशकोड के हैशकोड के लिए कोई डिफ़ॉल्ट मान है (यदि ऐसा है तो कृपया मान निर्दिष्ट करें)?हैश मैप

उत्तर

14
HashMap से

:

public V put(K key, V value) { 
    if (key == null) 
     return putForNullKey(value); 
    ... 

और अगर आप आगे देखने के लिए आपको लगता है कि अशक्त हमेशा आप HashMap में static int hash(int h) विधि का वर्णन पढ़ा, तो आप पाएंगे कि अशक्त कुंजी सूचकांक बिन 0

+0

मैं HashMap वर्ग कोड से मिल गया है कि लेकिन डाल कि बिन 0 में महत्वपूर्ण मूल्य जोड़ी मतलब यह है कि क्या बिन 0. – Prashant

+0

की hashCode मूल्य इसका मतलब है कि अशक्त के लिए hashCode 0 है, या है के लिए उत्पन्न hashCode क्या है (में सिद्धांत), कोई संख्या जो num को बनाए रखती है और (tableSize-1) == 0 – radai

+0

क्या आप यह कहना चाहते हैं कि शून्य कुंजी के लिए हैशकोड का डिफ़ॉल्ट मान 0 है और पहले बिन/बाल्टी का उपयोग इसे करने के लिए किया जाएगा हैश मैप कार्यान्वयन। – Prashant

3

को जाता है देखेंगे 0.

0

जब मानचित्र में शून्य मूल्य मौजूद होता है तो उस मान की कुंजी भी शून्य होती है। आपके पास मानचित्र में कई नल कुंजी नहीं हो सकती हैं। केवल एक शून्य कुंजी।

5

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

/** 
* 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; 
} 
0

यह स्पष्ट रूप से क्या होता है जब आप एक कुंजी है जो नक्शे में पहले से ही था के साथ एक डाल कर कहा गया है। कुंजी == नल का विशिष्ट मामला उसी तरह व्यवहार करता है: आपके पास शून्य कुंजी के लिए दो अलग-अलग मैपिंग नहीं हो सकते हैं (जैसे कि आप किसी अन्य कुंजी के लिए नहीं कर सकते)। यह आपके प्रश्न के संदर्भ के लिए एक विशेष मामला नहीं है।