2011-08-11 14 views
212

मान लें कि arraylist को ArrayList<String> arraylist के रूप में परिभाषित किया गया है, arraylist.removeAll(arraylist)arraylist.clear() के बराबर है?ArrayList.clear() और ArrayList.removeAll() के बीच क्या अंतर है?

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

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

+0

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

+3

@ कोररी: जब कोई प्रत्येक 'arraylist.removeAll (सरणीसूची)' का उपयोग करना चाहता है? मुझे ऐसा करने का बिल्कुल कोई कारण नहीं दिखता है। –

+0

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

उत्तर

304

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() बहुत तेजी से है, क्योंकि यह सब से निपटने के लिए नहीं है उन अतिरिक्त विधि कॉल।

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

+20

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

+0

@ जेफरी 'elementData [i] = null' और 'e.remove()' के बीच क्या अंतर है? – ateiob

+5

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

1

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

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

स्पष्टीकरण

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

Cleardeleteall से तेज़ है।

+1

मुझे पूरा यकीन है कि 'ArrayList.clear()' को भी लूप करना है। –

+0

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

+1

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

4

वे दो अलग-अलग उद्देश्यों की सेवा करते हैं। clear() बस वर्ग के एक उदाहरण को साफ़ करता है, removeAll() सभी दिए गए ऑब्जेक्ट्स को हटा देता है और ऑपरेशन की स्थिति देता है।

+0

आप आगे संदर्भ –

+1

@KasunSiyambalapitiya के लिए ऊपर बात पर पढ़ने के लिए एक संसाधन प्रदान करें कैसे कर सकते हैं [स्वीकार किए जाते हैं जवाब] के बारे में (http://stackoverflow.com/a/7032144/3040381) है, जो दो लोगों के लिए स्रोत कोड शामिल ? – Abdul

7

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

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

1

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

35

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

तो हाँ, ArrayList.clear बहुत तेज है।

9

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

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

3

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

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

मैं कल्पना कर सकते हैं कि जिस तरह से clear() तेजी से तो removeAll क्योंकि उसकी तुलना नहीं कर रहा है है, आदि

-5

सरणी => एक बार अंतरिक्ष रन टाइम पर किसी सरणी चर के लिए आवंटित किया जाता है, आबंटित स्थान नहीं बढ़ाई जा सकती या हटा दिया।

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

+0

यह सवाल का जवाब नहीं देता है जो ArrayList.clear() और ArrayList.removeAll() के बीच का अंतर है, कोई ऐरे और एक ऐरेलिस्ट के बीच का अंतर नहीं है। – Pierre

+0

यह उत्तर अनावश्यक है। सवाल यह नहीं है कि सवाल क्या है। –

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