2016-06-22 17 views
7

हाल ही में, एक साक्षात्कार में मुझसे पूछा गया था, हैशप में एक बाल्टी क्या है? चाहे वह सरणी या सरणीसूची हो या क्या?हैशपैप में बाल्टी क्या है?

मुझे भ्रमित हो गया। मुझे पता है कि हैशैप्स को सरणी द्वारा समर्थित किया जाता है। तो क्या मैं कह सकता हूं कि बाल्टी एक सरणी है जिसमें स्टार्टिंग हैशकोड्स की शुरुआत में 16 की क्षमता है और किस लिंक्ड सूचियों में उनके प्रारंभ सूचक हैं?

मुझे पता है कि एक हैशैप आंतरिक रूप से कैसे काम करता है, सिर्फ यह जानना चाहता था कि डेटा संरचनाओं के संदर्भ में वास्तव में एक बाल्टी क्या है।

+1

आप इस (http://stackoverflow.com/questions/6493605/how-does-a-java-hashmap-handle-different-objects-with पढ़ने की जरूरत है -हेथ-हैश-कोड/64 9 3 9 46 # 64 9 3 9 46) – emotionlessbananas

+0

@ जॉनीहेनली: मैं विशेष रूप से जानना चाहता था कि एक बाल्टी क्या है? उल्लिखित प्रश्न में, यह हैशकोड और हैशपैप कार्यान्वयन पर अधिक काम कर रहा है। इसलिए मैं अपने प्रश्न को डुप्लिकेट नहीं मानता। प्रश्न समान हो सकते हैं, लेकिन वे जो जवाब ढूंढ रहे हैं वे अलग हैं। – dgupta3091

उत्तर

14

नहीं, उस सरणी में प्रत्येक बाल्टी एक बाल्टी है जिसका आप उल्लेख कर रहे हैं। पहले जावा संस्करणों में, प्रत्येक बाल्टी में मानचित्र प्रविष्टियों की एक लिंक की गई सूची थी। नए जावा संस्करणों में, प्रत्येक बाल्टी में प्रविष्टियों की वृक्ष संरचना या प्रविष्टियों की एक लिंक की सूची होती है।

जावा 8 में कार्यान्वयन नोटों से:

/* 
* Implementation notes. 
* 
* This map usually acts as a binned (bucketed) hash table, but 
* when bins get too large, they are transformed into bins of 
* TreeNodes, each structured similarly to those in 
* java.util.TreeMap. Most methods try to use normal bins, but 
* relay to TreeNode methods when applicable (simply by checking 
* instanceof a node). Bins of TreeNodes may be traversed and 
* used like any others, but additionally support faster lookup 
* when overpopulated. However, since the vast majority of bins in 
* normal use are not overpopulated, checking for existence of 
* tree bins may be delayed in the course of table methods. 
... 
+0

तो जब हम कहते हैं कि हैशपैप की शुरुआत में 16 की क्षमता है, तो उस समय यह 16 अंतरिक्ष की सरणी बनाता है और इसके प्रत्येक तत्व को बाल्टी कहा जाता है। – dgupta3091

+0

@ dgupta3091 हां, हालांकि जावा 8 कार्यान्वयन में सरणी आलसी बनाई गई है (यानी केवल जब पहली प्रविष्टि हैश मैप में डाल दी गई हो)। – Eran

+0

@ जॉनी हेनली मैंने अभी जावा 8 में कार्यान्वयन की जांच की है, और कोई भी रचनाकार सरणी शुरू नहीं करता है। इसे केवल 'आकार बदलें') द्वारा प्रारंभ किया जाता है (जिसे सरणी शून्य होने पर 'put' द्वारा बुलाया जाएगा) और 'readObject (java.io.ObjectInputStream s)' (deserialization)। – Eran

13

bucket

मैं इस आप हैश नक्शे के कार्यान्वयन अच्छी तरह से समझने के लिए मदद मिल सकती है उम्मीद है।

0

बाल्टी मूल रूप से एक डेटा संरचना है जिसका उपयोग ऑपरेटिंग सिस्टम के पेजिंग एल्गोरिदम में किया जा रहा है। एक बहुत लेमन भाषा में होना।

वस्तुओं एक विशेष hashCode का प्रतिनिधित्व कि बकेट में संग्रहीत किया जा रहा है।

संदर्भ (मूल रूप से आप जो बाल्टी के संदर्भ में प्रस्तुत किया जाता है hashCode मूल्य होने के लिए लिंक्ड सूची डेटा संरचना के शीर्षक पर विचार कर सकते हैं) ऑब्जेक्ट का लिंक सूची में संग्रहीत किया जा रहा है, जिसका हेडर हैशकोड के मान का प्रतिनिधित्व करता है।

जेवीएम उन्हें और आकार बनाता है, जेवीएम द्वारा आवंटित स्मृति पर निर्भर करता है।

0

बाल्टी बिल्कुल नोड्स की एक सरणी है। तो एकल बाल्टी वर्ग java.util.HashMap.Node का एक उदाहरण है। प्रत्येक नोड लिंक्डलिस्ट के समान डेटा संरचना है, या ट्रीमैप (जावा 8 के बाद से) की तरह हो सकता है, हैशमैप खुद को तय करता है कि प्रदर्शन के लिए बेहतर क्या है - बाल्टी को लिंक्डलिस्ट या ट्रीमैप के रूप में रखें। TreeMap केवल खराब डिज़ाइन हैशकोड() फ़ंक्शन के मामले में चुना जाएगा, जब एकल बाल्टी में बहुत सी प्रविष्टियां रखी जाएंगी। देखें बाल्टी HashMap में की तरह लग रही है कि कैसे:

/** 
    * The table, initialized on first use, and resized as 
    * necessary. When allocated, length is always a power of two. 
    * (We also tolerate length zero in some operations to allow 
    * bootstrapping mechanics that are currently not needed.) 
    */ 
    transient Node<K,V>[] table; 
संबंधित मुद्दे