ArrayList.clear () और ArrayList.removeAll () के बीच अंतर क्या है?


283

यह माना जाता है कि arraylistके रूप में परिभाषित किया गया है ArrayList<String> arraylist, के arraylist.removeAll(arraylist)बराबर है arraylist.clear()?

यदि हां, तो क्या मैं मान सकता हूं कि clear()सरणी सूची को खाली करने के लिए विधि अधिक कुशल है?

arraylist.removeAll(arraylist)इसके बजाय का उपयोग करने में कोई चेतावनी है arraylist.clear()?


इस प्रश्न के लिए एक संभावित कोरोलरी: एक का उपयोग दूसरे के बजाय कब किया जा सकता है?
कोरी ओगबर्न

3
@ कोरी: जब हर एक का उपयोग करना चाहते हो सकता है arraylist.removeAll(arraylist)? मुझे लगता है कि ऐसा करने का कोई कारण नहीं है।
जोकिम सॉर 20

@ जोकिम सौर वही है जो मैं सत्यापित करना चाहता था। धन्यवाद +2 लेकिन क्या अंतर elementData[i] = nullऔर e.remove()महत्वपूर्ण है?
एटियोब

arrList.removeAll(arrList)इसके बजाय करने के लिए कोई समझदार कारण नहीं है arrList.clear()arrList1.removeAll(arrList2)अलग बात है।
व्लाद

3
यदि केवल हटाने () के कार्यान्वयन को इस पंक्ति के साथ शुरू किया गया था, तो यह पूरी चर्चा इतनी अधिक मनोरंजक हो सकती थी !!! if (c == this && !isEmpty()) { clear(); return true; }। मुझे इसे पैच के रूप में OpenJDK में जमा करना होगा! ;-)
जूलियस मुसेउ

जवाबों:


396

के लिए स्रोत कोड clear():

public void clear() {
    modCount++;

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

    size = 0;
}

के लिए स्रोत कोड removeAll()(जैसा कि परिभाषित किया गया है AbstractCollection):

public boolean removeAll(Collection<?> c) {
    boolean modified = false;
    Iterator<?> e = iterator();
    while (e.hasNext()) {
        if (c.contains(e.next())) {
            e.remove();
            modified = true;
        }
    }
    return modified;
}

clear() यह बहुत तेजी से है क्योंकि यह उन सभी अतिरिक्त विधि कॉल के साथ सौदा नहीं है।

और जैसा कि एट्रे बताते हैं, ओ (एन 2 ) c.contains(..)की समय जटिलता को बढ़ाता है, क्योंकि यह removeAllओ (एन ) के विपरीत है ।clear


29
एक नोट जो c.contains(...)ऑपरेशन के समय की जटिलता को पूरा करता है, वह इस उत्तर को पूरा करेगा।
Atreys

8
स्रोत इस एक में मजबूत है। (अन्य सभी उत्तरों के लिए: स्रोत का उपयोग करें, ल्यूक।) ध्यान दें कि कैसे स्पष्ट () को केवल एक पंक्ति के रूप में लागू किया जा सकता है, आकार = 0; लेकिन कचरा-संग्रह तत्वों को सरणी के अगम्य भागों में एकत्र करना नहीं जानता।
जूलियस मुसेउ

2
e.remove () रास्ता अधिक जटिल है! e.remove () भी जटिलता को ठीक करता है, जैसे c.contains (...) करता है। एक ArrayList पर, e.remove () ArrayList.remove (int index) कहता है, जिसे शेष सरणी को एक के ऊपर से शिफ्ट करना होता है।
जूलियस मुसेउ

1
@ateiob e.remove () दो अतिरिक्त विधि कॉल, एक श्रेणी की जाँच, और एक वस्तु वापसी (आंतरिक AbstractList.Itr.remove()और ArrayList.remove(int)), भी है
Atreys

2
@ जूलियस यदि यह ऐसा करता है: size = 0; elementData = new Object[10];सभी शेष कचरा एकत्र किया जाएगा, क्योंकि बैकिंग सरणी में कोई बाहरी संदर्भ नहीं है।
corsiKa

51

का समय जटिलता ArrayList.clear()है O(n)और removeAllहै O(n^2)

तो हां, ArrayList.clearज्यादा तेज है।


15

clear()विधि एक एकल के सभी तत्वों को हटा ArrayList। यह एक तेज़ ऑपरेशन है, क्योंकि यह सिर्फ एरे तत्वों को सेट करता है null

removeAll(Collection)विधि, जिस से विरासत में मिली है AbstractCollection, उन सभी तत्वों को हटा देती है जो आपके द्वारा विधि को कॉल करने वाले संग्रह से तर्क संग्रह में हैं। यह एक अपेक्षाकृत धीमा ऑपरेशन है, क्योंकि इसमें शामिल संग्रह में से एक के माध्यम से खोज करना है।


मैंने सोचा कि यह सिर्फ सभी को सेट करता है, कुछ तत्वों को शून्य करने के लिए नहीं। यदि यह मामला नहीं है, तो यह कैसे तय हुआ कि किन तत्वों को शून्य करने के लिए सेट किया जाना चाहिए?
फरीद

2
@ क्षमा करें, मेरी अंग्रेजी यहाँ बहुत अनौपचारिक है। मेरा वास्तव में मतलब था कि यह सभी तत्वों को शून्य करने के लिए सेट करता है। मैं इसे ठीक कर दूंगा!
अर्नेस्ट फ्राइडमैन-हिल

7

जब तक कि एक विशिष्ट अनुकूलन नहीं होता है, तो जांचता है कि क्या तर्क पारित हो गया removeAll()है वह संग्रह ही है (और मुझे अत्यधिक संदेह है कि इस तरह का अनुकूलन होता है) यह एक साधारण से काफी धीमा होगा .clear()

इसके अलावा (और कम से कम समान रूप से महत्वपूर्ण): arraylist.removeAll(arraylist)बस obtuse, भ्रमित कोड है। यह "इस संग्रह को साफ़ करें" कहने का एक बहुत ही पिछड़ा तरीका है। इससे क्या फायदा होगाबहुत समझ में arraylist.clear() ?


7

वे विभिन्न उद्देश्यों की पूर्ति करते हैं। clear()कक्षा का एक उदाहरण removeAll()देता है , सभी दी गई वस्तुओं को हटाता है और ऑपरेशन की स्थिति को वापस करता है।


आप किसी संसाधन उपलब्ध कराने के आगे संदर्भ के लिए ऊपर बात पर पढ़ने के लिए कृपया कर सकते हैं
Kasun Siyambalapitiya

1
@KasunSiyambalapitiya स्वीकृत उत्तर के बारे में , जिसमें दोनों के लिए स्रोत कोड शामिल है?
अब्दुल

5

clear() अंतर्निहित एरे के माध्यम से जाएगा और प्रत्येक प्रविष्टि को अशक्त करने के लिए सेट करेगा;

removeAll(collection)संग्रह के लिए ArrayList जाँच के माध्यम से जाना जाएगा और remove(Object)अगर यह मौजूद है।

मुझे लगता clear()है कि यह तेजी से रास्ता है तो सभी को हटा दें क्योंकि यह तुलना नहीं कर रहा है, आदि।


2

स्पष्ट तेज है क्योंकि इसे हटाने के लिए तत्वों पर लूप नहीं है। यह विधि मान सकती है कि सभी तत्वों को हटाया जा सकता है।

Remove allजरूरी नहीं कि सूची में सभी तत्वों को हटा दिया जाए, केवल उन्हें प्रदान किए जाने वाले मापदंडों के रूप में हटा दिया जाए। इसलिए, उन लोगों को रखने के लिए अधिक प्रयास की आवश्यकता होती है जिन्हें हटाया नहीं जाना चाहिए।

स्पष्टीकरण

'लूप' से मेरा मतलब है कि यह जाँचने की ज़रूरत नहीं है कि तत्व को रखा जाना चाहिए या नहीं। इसे nullहटाने के लिए तत्वों की प्रदान की गई सूचियों के माध्यम से खोज किए बिना संदर्भ सेट कर सकते हैं ।

Clearसे भी तेज है deleteall


1
मुझे पूरा यकीन है कि ArrayList.clear()इसे भी लूप करना होगा।
जोकिम सॉयर 20

@JVerstry आप मतलब है कि स्पष्ट () को नहीं हटाता तत्वों यह ArrayList से निकाल देता है?
एटियोब

1
गलत, आंतरिक सरणी पर लूप स्पष्ट करता है और कचरा कलेक्टर को अपना काम करने देने के लिए सभी संदर्भों को अशक्त करने के लिए सेट करता है।
Devconsole 20

1
@Joachim, @devconsole: मुझे लगता है कि उनका मतलब यह था कि पैरामीटर के रूप में दी गई सूची पर लूप / पुनरावृति नहीं होगी। target.removeAll(param)अधिक पुनरावृति जाएगा paramऔर उसके बाद फोन target.contains(...)जिस पर iterates target
Vlad

2
-3 थोड़ा कठोर है। अगर JVerstry चाहता था, तो वह अपने जावा कार्यान्वयन को खरोंच से लिख सकता था जो लूप नहीं करता था। स्पष्ट () संभवत: O (1) में, बिना लूप के लागू किया जा सकता है, जबकि removeAll () MUST में कुछ प्रकार का O (n) एल्गोरिथ्म है, सभी तत्वों की जांच किए बिना हटाने () API के अनुबंध को संतुष्ट करने का कोई तरीका नहीं है।
जूलियस मुसेउ

1

स्पष्ट () बहुत अधिक कुशल होगा। यह बस प्रत्येक आइटम को हटा देगा। RemoveAll (arraylist) का उपयोग करना बहुत अधिक काम लेगा क्योंकि यह arraylist में प्रत्येक आइटम को यह देखने के लिए जांच करेगा कि क्या इसे हटाने से पहले यह arraylist में मौजूद है।


-8

Array => एक बार रन टाइम पर Array वैरिएबल के लिए स्पेस आवंटित होने के बाद, आवंटित स्पेस को बढ़ाया या हटाया नहीं जा सकता है।

ArrayList => यह सरणी सूची में नहीं है। ArrayList रन टाइम पर बढ़ और सिकुड़ सकता है। आवंटित स्थान को रन टाइम पर कम से कम या अधिकतम किया जा सकता है।


यह उस प्रश्न का उत्तर नहीं देता है जो ArrayList.clear () और ArrayList.removeAll () के बीच का अंतर है, न कि किसी Array और ArrayList के बीच का अंतर।
पियरे

यह उत्तर अनावश्यक है। यही सवाल नहीं है।
सेराफिम कोस्टा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.