2012-05-29 18 views
31

मैं ArrayList के लिए जावा दस्तावेज़ को देखा और पाया कि ArrayList के आरंभिक क्षमता 10.ऐरेलिस्ट 10 की डिफ़ॉल्ट क्षमता क्यों है?

/** 
* Constructs an empty list with an initial capacity of ten. 
*/ 
public ArrayList() { 
this(10); 
} 

मुझे लगता है कि यह कोई मतलब होता अगर यह 2 के किसी भी शक्ति थे, लेकिन क्यों 10 है?

मैंने हैश मैप की प्रारंभिक क्षमता की भी जांच की, और यह 16 है जो समझ में आता है।

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

/** 
* Constructs an empty <tt>HashMap</tt> with the default initial capacity 
* (16) and the default load factor (0.75). 
*/ 
public HashMap() { 
    this.loadFactor = DEFAULT_LOAD_FACTOR; 
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); 
    table = new Entry[DEFAULT_INITIAL_CAPACITY]; 
    init(); 
} 

क्या संख्या 10 के पीछे कोई निर्दिष्ट कारण है?

+15

>>> _it अगर यह 2_ की शक्ति की कोई संख्या होगी तो क्या हो सकता है? –

+4

मुझे लगता है कि यह सीएस में प्रमुख जीवन रूप में वापस चला जाता है, जिसमें प्रत्येक पर 5 अंकों के साथ दो मैनिपुलेटर्स होते हैं।वे लोग जहां कंप्यूटिंग के शुरुआती दिनों में गिनने के लिए इस्तेमाल किया जाता था। इसलिए वे सभी प्रकार की चीजों के लिए 10 की शक्तियों को पसंद करते हैं। –

+4

10 ऐरे सूची की प्रारंभिक क्षमता आकार नहीं है। प्रारंभिक आकार हमेशा 0. – BOSS

उत्तर

35

ArrayList सरल बढ़ती सरणी है। तत्व जोड़ने की कोशिश करते समय, और बफर आकार पार हो गया है, यह बस बढ़ रहा है। तो प्रारंभिक आकार कोई सकारात्मक मूल्य हो सकता है।

1 बहुत छोटा होगा। यहां तक ​​कि कुछ तत्वों के साथ ही हमारे पास कुछ आकार बदलने का संचालन होगा।

100 अंतरिक्ष का नुकसान होगा।

तो, 10 समझौता है। क्यों 10 और 12 या 8 नहीं? पहला संकेत, कि सामान्य उपयोग के मामलों का विश्लेषण किया गया था और यह प्रदर्शन खोने और अंतरिक्ष के खोने के बीच सबसे अच्छा फिट है। हालांकि, मुझे लगता है कि, सूर्य के मूल कोड को देखते हुए, यह इतना गहराई से विश्लेषण नहीं किया गया था और यह एक मनमानी 'बहुत छोटा नहीं, बहुत बड़ा नहीं' नंबर है।

1

10 शायद तत्वों की डिफ़ॉल्ट संख्या के लिए एक कम या कम मनमाना संख्या है।

+1

मुझे नहीं लगता कि सूर्य डेवलपर्स बिना किसी सोच के डिफ़ॉल्ट संख्या के रूप में किसी भी यादृच्छिक संख्या का उपयोग करने के लिए पर्याप्त पागल हैं। उन्होंने कुछ उपयोगी और कुशल परिदृश्य के बारे में सोचा होगा। –

5

पूरी तरह से मनमाने ढंग से पसंद।

और ऐसा कोई कारण नहीं है कि पावर ऑफ -2 यहां और अधिक समझ में क्यों आता है। हैशिंग कैसे काम करता है, इस वजह से यह हैश मैप में समझ में आता है। वास्तव में, यह होना चाहिए दो की शक्ति (स्रोत में टिप्पणी के अनुसार)।

नोट java.util.Vector (जो ArrayList के बड़े भाई हैं) ने भी 10

+0

हाँ, यह भी है। और ArrayList की क्षमता का भी कारण हो सकता है। लेकिन फिर सवाल यह है कि वेक्टर की प्रारंभिक क्षमता 10 क्यों है? –

13

एक सूची के लिए है कि, वहाँ क्षमता दोनों में से एक शक्ति होना होने में कोई फायदा नहीं है। वास्तव में, किसी भी विशिष्ट प्रारंभिक क्षमता में कोई वास्तविक लाभ नहीं है। छोटी सूचियों के सामान्य मामले के लिए कई आकार बदलने के चरणों से बचने के लिए यह काफी बड़ा होना चाहिए, और उस मामले में अप्रयुक्त क्षमता पर स्मृति को बर्बाद न करने के लिए पर्याप्त छोटा होना चाहिए। 10 शायद इसलिए चुना गया था क्योंकि यह इन आवश्यकताओं को पूरा करने के लिए सही सीमा में पड़ता है और क्योंकि यह "गोल" है।

+1

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

+5

@Priyank Doshi: आप इस पर अधिक विचार कर रहे हैं ... – Thilo

+3

@Priyank Doshi: आदर्श प्रारंभिक क्षमता अनुप्रयोगों के बीच अलग होगी, इसलिए औसत से अधिक परिदृश्य परिदृश्य वास्तव में बहुत उपयोगी नहीं होंगे - सटीक मूल्य बेहद असंभव है अधिकांश अनुप्रयोगों के लिए महत्वपूर्ण है, लेकिन जिनके लिए यह महत्वपूर्ण है, आप उस विशिष्ट एप्लिकेशन के लिए सर्वोत्तम मूल्य का उपयोग करना चाहेंगे, कुछ औसत नहीं। –

0

जब तक कोड में कोई टिप्पणी न हो, हम कभी भी निश्चित रूप से नहीं जान पाएंगे। हालांकि, मुझे लगता है कि किसी बिंदु पर एक सन इंजीनियर ने बड़ी संख्या में असली दुनिया के अनुप्रयोगों पर ऐरेलिस्टिस्ट के उपयोग पर आंकड़े एकत्र किए हैं, और निर्धारित ... अनुभवजन्य ... कि 10 ने औसत पर लगभग सर्वोत्तम परिणाम दिए हैं। (इस तरह वे इस तरह की चीजें, ऑप्टिमाइज़र, बाइटकोड डिज़ाइन आदि को ट्यून करते हैं।)

और, और अन्य ने बताया कि आकार का उपयोग करने में कोई कम्प्यूटेशनल लाभ (या हानिकारक) नहीं है जो दो की शक्ति है ArrayList के आकार के लिए।

10

Vector, जेडीके 1.0 से 10 की डिफ़ॉल्ट प्रारंभिक क्षमता थी, इसलिए संभवत: यह ArrayList 1.2 में पेश किए जाने पर लगातार बने रहने के लिए कुछ समझ में आया।

+0

नहीं। यह एक असंगत परिवर्तन होगा। जावाडोक, जो कि कल्पना है, कहता है कि डिफ़ॉल्ट क्षमता 10 है, इसलिए वे इसे बदल नहीं सकते हैं। – Thilo

+3

@PriyankDoshi मेरा मतलब यह है कि वे संभवतः वेरेक्टर के साथ बने रहने के लिए ऐरेलिस्ट के लिए कामना करते थे, क्योंकि वे निकट से संबंधित हैं। अन्य संग्रह कार्यान्वयन का जिक्र नहीं है। –

संबंधित मुद्दे