2013-08-14 8 views
7

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#473java.util.Arraylist # स्पष्ट क्यों किया गया था ओपनजेडीके में जिस तरह से था?

public void clear() { 
    modCount++; 

    // Let gc do its work 
    for (int i = 0; i < size; i++) 
     elementData[i] = null; 

    size = 0; 
} 

मेरा प्रश्न है, कारण है कि वे प्रत्येक तत्व कचरा संग्रहण के लिए योग्य बनाने के लिए जब वे सिर्फ समर्थन सरणी इसे पुनः शुरू किया जा सकता था समर्थन सरणी {हे (एन)} के माध्यम से एक आते-जाते हैं की क्या ज़रूरत थी, पूरे सरणी के संदर्भ को संपूर्ण {ओ (1)} के रूप में संदर्भित करना और इसे कचरा संग्रहण के लिए योग्य बनाना? ओ (एन) clear() के लिए प्रदर्शन मेरे लिए इतना अच्छा प्रतीत नहीं होता है या क्या मुझे कुछ याद आ रही है?

+2

[list.clear() बनाम सूची = नई ArrayList ();] (http://stackoverflow.com/questions/6961356/list-clear-vs-list-new-arraylistinteger) के संभावित डुप्लिकेट – Tala

+0

मैं नहीं लगता है कि यह एक डुप्लिकेट है। – nawfal

उत्तर

9

ऐसा करने से जिस तरह से उन्होंने आपको बैकिंग स्टोरेज को फिर से आवंटित किए बिना सरणी का पुन: उपयोग करने दिया। यदि आप सरणी को पुन: आवंटित करना चाहते हैं, तो आप इसे स्वयं कर सकते थे, क्योंकि ArrayList के प्रतिनिधित्व में ज्यादातर इसका बैकिंग स्टोरेज होता है।

यदि उन्होंने पूरी तरह से सरणी जारी की है, तो clear() पर कॉल करने और ArrayList को फिर से असाइन करने के बीच बहुत कम अंतर होगा। अब वे आपको सरणी का पुन: उपयोग करने या इसे एक नए ब्रांड के साथ बदलने के बीच चुनने का विकल्प देते हैं।

+0

लगभग उसी तरह, कोई ऐसा कर सकता था: 'के लिए (loop_through_list ई के रूप में) {e = null}' // छद्म कोड –

+1

@ सैयोओलेडजी राइट, लेकिन इसके लिए एक लूप की आवश्यकता होगी, और अतिरिक्त तर्क लेगा प्रत्येक बार जब आप तत्व को 'शून्य' पर सेट करते हैं तो जांचें। जब आप 'नया ArrayList()' करते हैं तो आप एक पंक्ति के लिए एक पंक्ति का व्यापार करते हैं, लूप के लिए एक पंक्ति नहीं। – dasblinkenlight

+0

अब मेरे पास निर्दोष दिखने वाले 'डीफ़ एआर = नए ऑब्जेक्ट [एन] ' धन्यवाद का एक बिल्कुल अलग परिप्रेक्ष्य है! –

3

यह कार्यान्वयन पुनर्वितरण के बिना सरणी पुन: उपयोग की अनुमति देता है। Allocating an array in java can be O(n) anyway क्योंकि JVM सभी तत्वों को डिफ़ॉल्ट मानों में प्रारंभ करेगा।

2

यदि आप एक ArrayList को स्पष्ट() कर रहे हैं, तो आप स्पष्ट रूप से इसका पुन: उपयोग करना चाहते हैं - और इसलिए किसी भी पुन: उपयोग में वस्तुओं की एक ही संख्या हो सकती है। तो आकार बदलने के संचालन से परहेज करना एक अच्छा विचार है।

साथ ही, ध्यान नंगे कि JIT संकलन मामलों यहाँ, संभवतः एक बहुत - कि पाश अत्यंत कैश अनुकूल & व्यक्ति आपरेशन होने जा रहा है बहुत सस्ता कर रहे हैं - शायद सिर्फ एक संकलित मामले में प्रत्येक के लिए एक मशीन अनुदेश ।

0

यह clear() impl in Java's LinkedList जैसा ही कारण है जो जावा Generational Garbage Collection है।

यह ऐरेलिस्ट और बैकिंग सरणी को 'पुरानी पीढ़ी' में पदोन्नत होने की अधिक संभावना है, जहां यह युवा पीढ़ी में होने वाली सरणी इंडेक्स द्वारा संदर्भित वस्तुओं को पकड़ना संभव है। सभी इंडेक्स को शून्य पर सेट करने से बैकिंग सरणी एकत्र होने से पहले उन छोटी वस्तुओं को एकत्रित किया जा सकता है।

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