2012-05-17 10 views
5

संभव डुप्लिकेट:
Java HashMap Default Initial Capacityमहत्व

मैं java.util.HashMap में HashMap के कार्यान्वयन पढ़ रहा था। प्रारंभिक क्षमता, अधिकतम क्षमता इत्यादि, दो की शक्तियां हैं। घोषणा के

पार्ट्स java.util.HashMap

/** 
* The default initial capacity - MUST be a power of two. 
*/ 
static final int DEFAULT_INITIAL_CAPACITY = 16; 


/** 
* The maximum capacity, used if a higher value is implicitly specified 
* by either of the constructors with arguments. 
* MUST be a power of two <= 1<<30. 
*/ 
static final int MAXIMUM_CAPACITY = 1 << 30; 


/** 
* The table, resized as necessary. Length MUST Always be a power of two. 
*/ 
transient Entry[] table; 

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

+1

कुछ प्रकार की हैश सारणी गणना की हैश मान के बिट पैटर्न से कुछ बिट्स का उपयोग करती है, जो सरणी में सूचकांक के रूप में होती है। उस स्थिति में, आकार दो की शक्ति होनी चाहिए। ऐसा लगता है कि हैश मैप का कार्यान्वयन इस तरह से काम करता है। –

उत्तर

14

दो की शक्तियों का उपयोग कार्यान्वयन को सरल बनाता है और इसके प्रदर्शन में सुधार करता है।

उदा। एक हैश कोड से एक बाल्टी को खोजने के लिए यह सैद्धांतिक रूप से बोल रहा abs(hash) % SIZE

1

के बजाय hash & (SIZE -1) उपयोग कर सकते हैं, हम सूची का विस्तार की लागत amortize केवल तभी कर सकते आपरेशन नक्शा बढ़ जाती है में तत्वों की संख्या के रूप में नगण्य हो जाता है। लोड फैक्टर तक पहुंचने पर हर बार आकार को दोगुना करना प्रविष्टियों के विस्तार और पुनः लोडिंग को सुनिश्चित करने का एक तरीका है।

कारण यह विशेष रूप से दो की शक्ति है, इसलिए जब हम एक तत्व है, परिणामी पूर्णांक (32-बिट) को पहले के-बिट्स में छोटा कर दिया जा सकता है, जहां के लॉग (एन) जहां एन वर्तमान क्षमता है।

+1

दोनों बिंदु सही हैं, हालांकि यह ध्यान देने योग्य है कि दूसरा बिंदु निष्पादन शर्तों में अपेक्षाकृत महत्वहीन है। –