2011-05-25 13 views
5

मैं अक्सर अपने एंड्रॉइड अनुप्रयोगों में सूचियों का उपयोग करता हूं। अभी मैं एक ट्विटर पेज बना रहा हूं जिसमें उपयोगकर्ता के अधिकतम 50 "ट्वीट्स" सूचीबद्ध हैं।जावा में एक सूची की क्षमता घोषित करना

मैं इस तरह परिभाषित किया गया एक सूची है:

List<Tweet> tweets = new ArrayList<Tweet>(MAX_TWEETS);

कहाँ Tweet एक कस्टम ऑब्जेक्ट प्रकार होल्डिंग चहचहाना अद्यतन जानकारी है (टेक्स्ट, दिनांक, उपयोगकर्ता नाम, आदि) और MAX_TWEETS एक निरंतर पूर्णांक मान है (50)।

सवाल:

, इस List की आरंभिक क्षमता की स्थापना करता है, तो किसी भी क्या लाभ है?

क्या मुझे पता होना चाहिए कि मेरी सूची यह छोटी होगी? मुझे क्षमता कब स्थापित नहीं करनी चाहिए?

उत्तर

2

ऐरेलिस्ट की डिफ़ॉल्ट क्षमता 10 पर सेट है (jdk 1.6 स्रोत देखें)। इसका मतलब है कि सृजन पर आकार 10 की सरणी आवंटित की जाएगी। यदि आप तत्व संख्या 11 जोड़ देंगे तो क्षमता 16 हो जाएगी। फिर 21 तक पहुंचने के बाद फिर से वृद्धि करें।

यदि आप 50 से अधिक तत्वों की अपेक्षा नहीं करते हैं तो सरणी अधिकतम 3 बार आकार बदल जाएगी। यह देखते हुए कि छोटी संख्या, वास्तव में इससे कोई फर्क नहीं पड़ता। इसे 50 पर सेट करें यदि यह आपको सरणी प्रतिलिपि पर सहेजने के दिमाग का एक टुकड़ा देता है।

int newCapacity = (oldCapacity * 3)/2 + 1; 
2

इस सूची की प्रारंभिक क्षमता निर्धारित करने का क्या फायदा है?

यह आंतरिक रूप से उस आकार की स्मृति आवंटित करेगा और जब यह बढ़ता है तो यह स्मृति को फिर से आवंटित करेगा और करेगा। अगर हम उचित प्रारंभिक क्षमता की आपूर्ति करते हैं तो हम ओवरफ्लो को समायोजित करते समय कुछ सीपीयू चक्र बचा सकते हैं।

2

सूची की कैपेसिटी सेट करना केवल यह निर्दिष्ट करेगा कि यह कितना बड़ा होगा। ऐसा करने के लिए एकमात्र पक्ष यह तथ्य होगा कि जब आप किसी सूची के डिफ़ॉल्ट आकार से अधिक आइटम जोड़ते हैं, तो उसे सूची का विस्तार नहीं करना पड़ेगा।

उदाहरण: आप सूची को 25 पर सेट करते हैं, और डिफ़ॉल्ट 10 है? (100% निश्चित नहीं) यदि आप 24 तत्व जोड़ते हैं तो उसे सूची में वृद्धि नहीं करनी पड़ेगी। यदि आप इसे डिफ़ॉल्ट के रूप में छोड़ देते हैं तो यह बढ़ेगा।

आशा है कि यह

3

में मदद करता है आरंभिक क्षमता की स्थापना जब सूची पॉप्युलेट प्रदर्शन को बढ़ा सकते हैं, और यदि आप सूची में आइटम की संख्या इससे अधिक जोड़ने कभी नहीं यह भी सूची की स्मृति पदचिह्न को कम कर सकते हैं।

एक सूची है कि बड़ा हो गया है की स्मृति पदचिह्न, और एक समर्थन सरणी संग्रहीत कम किया जा सकता आइटम की संख्या से अधिक trimToSize()

2

लागू आरंभिक क्षमता में मदद करता है अगर आप जानते हैं कि आप की आवश्यकता होगी कर रहा है कि हो सकता है बिल्कुल वह राशि। यह एक कंटेनर बनाएगा जो MAX_TWEETS आइटमों को संदर्भित करने में सक्षम होगा। यदि आप इसे पार करते हैं, तो सिस्टम दो बार कई वस्तुओं के साथ एक नई सूची तैयार करेगा, फिर मूल सूची (जो जावा अनुप्रयोगों में काफी आम है) पर प्रतिलिपि बनाएँ।

3

डिफ़ॉल्ट रूप से, जावा 6 में, सूची का आकार 10 है। यानी, सिस्टम अंतर्निहित ऐरे में दस मेमोरी स्लॉट बनाता है। यदि आप 11 वें तत्व को जोड़ने का प्रयास करते हैं, तो केवल ऐरे प्रतिलिपि बनाई गई है। एक आकार प्रदान करना प्रदर्शन में सुधार करता है।

2

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

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

2

यह निर्माण पर स्मृति आवंटित करेगा और जब तक आप उस पर जाने की प्रतिलिपि करने के लिए नहीं होगा:

वास्तव में इस आकार में वृद्धि का सही तरीका है।

लेकिन ईमानदारी से, केवल 50 वस्तुओं के साथ, प्रतिलिपि वैसे भी अधिक प्रयास नहीं करेगी, इसलिए मुझे संदेह है कि आपको कोई प्रदर्शन लाभ दिखाई देगा। लेकिन, आकार निर्दिष्ट करने के लिए कोई नकारात्मक पक्ष नहीं है, इसलिए आप इसे भी कर सकते हैं।

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