2012-10-18 25 views
6

मैं एक hashtable के लिए डाल विधि के जावा के कार्यान्वयन के माध्यम से जा रहा था और इस में आए:क्यों एक HashTable दुकान जावा में तालिका में कुंजी के हैश मान करता

// Makes sure the key is not already in the hashtable. 
    Entry tab[] = table; 
    int hash = key.hashCode(); 
    int index = (hash & 0x7FFFFFFF) % tab.length; 
    for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) { 
     if ((e.hash == hash) && e.key.equals(key)) { 
      V old = e.value; 
      e.value = value; 
      return old; 
     } 
    } 

जब मैं एक महत्वपूर्ण समझते हैं कि टकराव की जांच करने के लिए आवश्यक है, जावा कुंजी के हैश मान को संग्रहीत क्यों कर रहा है और इसे जांच रहा है?

उत्तर

8

क्योंकि एक ही बाल्टी (tab) % tab.length ऑपरेशन के कारण अलग-अलग हैंश वाले आइटम रख सकती है। यदि हैश अलग हैं तो equals() पर कॉल करने से बचने के लिए पहले हैश जांचना शायद कुछ प्रदर्शन अनुकूलन है।

इसे एक उदाहरण में रखने के लिए: कहें कि आपके पास महंगी equals() विधि के साथ दो जटिल वस्तुएं हैं। एक ऑब्जेक्ट में हैश 1 के बराबर है जबकि अन्य ऑब्जेक्ट में 32 हैश है। यदि आप दोनों ऑब्जेक्ट्स को हैश टेबल में 31 बाल्टी रखते हैं, तो वे एक ही बाल्टी (tab) में समाप्त हो जाएंगे। एक दूसरी (अलग वस्तु) जोड़ते समय आपको यह सुनिश्चित करना होगा कि यह अभी तक तालिका में नहीं है। आप तुरंत equals() का उपयोग कर सकते हैं, लेकिन यह धीमा हो सकता है। इसके बजाय आप पहली बार हैश की तुलना करें, यदि आवश्यक नहीं तो महंगा equals() से परहेज करें। इस उदाहरण में हैंश अलग हैं (एक ही बाल्टी में होने के बावजूद) तो equals() आवश्यक नहीं है।

1

यह तेजी से पहुंच बनाता है, क्योंकि हैश मान को प्रत्येक एक्सेस के लिए पुन: संयोजित करने की आवश्यकता नहीं है। यह केवल स्पष्ट खोजों के लिए महत्वपूर्ण नहीं है (जहां equals करने से पहले हैश चेक किया गया है) लेकिन रीहाश के लिए भी।