HashMap
के मूल विचार यह है:
- एक
HashMap
वास्तव में विशेष वस्तुओं है कि दोनों कुंजी और मान पकड़ की एक सरणी है।
- सरणी, बाल्टी (स्लॉट) की कुछ राशि है का कहना है कि 16
- हैशिंग एल्गोरिथ्म हर वस्तु है कि
hashCode()
विधि द्वारा प्रदान की जाती है। इसलिए, जब आप एक नया Class
लिख रहे हैं, तो आपको उचित hashCode()
और equals()
विधियों के कार्यान्वयन का ख्याल रखना चाहिए। डिफ़ॉल्ट एक (Object
वर्ग का) स्मृति सूचक को एक संख्या के रूप में लेता है। लेकिन यह उन वर्गों के लिए अच्छा नहीं है जिन्हें हम उपयोग करना चाहते हैं। उदाहरण के लिए, String
कक्षा एक एल्गोरिदम का उपयोग करती है जो स्ट्रिंग में सभी वर्णों से हैश बनाता है - इसे इस तरह सोचें: hashCode = 1.char + 2.char + 3.char...
(सरलीकृत)। इसलिए, दो बराबर स्ट्रिंग्स, भले ही वे स्मृति में एक अलग स्थान पर हैं, वही hashCode()
है।
hashCode()
का परिणाम, "132" कहें, तो बाल्टी की संख्या है जहां ऑब्जेक्ट को संग्रहीत किया जाना चाहिए यदि हमारे पास बड़ी सरणी थी। लेकिन हम नहीं करते हैं, हमारा केवल 16 बाल्टी लंबा है। इसलिए हम स्पष्ट गणना 'hashcode % array.length = bucket'
या '132 mod 16 = 4'
का उपयोग करें और अगर कोई अन्य जोड़ी अभी तक है कुंजी-मान पेयर एक बाल्टी संख्या में 4.
-
- की दुकान, यह ठीक है।
- यदि हमारे पास कुंजी के बराबर कुंजी है, तो हम पुराने को हटा देते हैं।
- यदि कोई अन्य कुंजी-मूल्य जोड़ी (टकराव) है, तो हम पुरानी एक को एक लिंक्ड सूची में ले जाने के बाद नई श्रृंखला को चेन करते हैं।
- समर्थन सरणी भी भरा हो जाता है, तो हम भी कई जुड़ा हुआ सूचियों बनाने के लिए हम दोगुनी लंबाई के साथ एक नई सरणी बनाने के लिए होता है, सभी तत्वों को मिला देना और उन्हें नए सरणी में जोड़ने के लिए, तो हम निपटाने पुराना वाला।यह
HashMap
पर सबसे महंगा ऑपरेशन है, इसलिए आप अपने Maps
को बताना चाहते हैं कि यदि आप इसे पहले जानते हैं तो आप कितनी बाल्टी का उपयोग करेंगे।
- यदि कोई व्यक्ति मूल्य प्राप्त करने का प्रयास करता है, तो वह एक कुंजी प्रदान करता है, हम इसे हैश करते हैं, इसे संशोधित करते हैं, और फिर सटीक मिलान के लिए संभावित लिंक्ड सूची में जाते हैं।
An image, courtesy of Wikipedia: ![The graphics](https://i.stack.imgur.com/ySwxR.png)
इस मामले में,
- 256 बाल्टी (गिने, ज़ाहिर है, 0-255)
- पांच लोगों को देखते हैं के साथ एक सरणी है। उनके हैशकोड,
mod 256
के माध्यम से डालने के बाद, सरणी में चार अलग-अलग स्लॉट इंगित करें।
- आप देख सकते हैं कि सैंड्रा डी के पास मुफ्त स्लॉट नहीं था, इसलिए जॉन स्मिथ के बाद उसे जंजीर कर दिया गया।
अब, अगर आपने सैंड्रा डी के टेलीफोन नंबर को देखने का प्रयास किया है, तो आप उसका नाम होगा, इसे 256 तक संशोधित करें, और बाल्टी 152 में देखें। वहां आपको जॉन स्मिथ मिलेगा। यह कोई सैंड्रा नहीं है, आगे देखो ... आह, सैंड्रा जॉन के बाद जंजीर है।
स्रोत
2012-06-05 09:45:21
यदि आपको छवियों के साथ समझाया गया कोई भी लिंक मिलता है तो कृपया इसे यहां रखें .. यह बहुत उपयोगी होगा .. – Sahal
हो गया। यह [विकिपीडिया में इस लेख] से है (http://en.wikipedia.org/wiki/Hash_table#Separate_chaining_with_list_heads)। –
और अब, जब आप इसे जानते हैं, [यह 'स्ट्रिंग' असली' हैशकोड() 'कार्यान्वयन] है (http://docs.oracle.com/javase/7/docs/api/java/lang/ String.html # hashCode% 28% 29)। [और] (http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier) [कुछ] (http://stackoverflow.com/ प्रश्न/1835 9 76/क्या-एक-समझदार-प्राइम-फॉर हैशकोड-गणना) [यादृच्छिक] (http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode) 'हैशकोड()' में प्राइम नंबर चयन पर लिंक। –