簡體   English   中英

ArrayList.clear() 和 ArrayList.removeAll() 有什么區別?

[英]What is the difference between ArrayList.clear() and ArrayList.removeAll()?

Assuming that arraylist is defined as ArrayList<String> arraylist , is arraylist.removeAll(arraylist) equivalent to arraylist.clear() ?

如果是這樣,我可以假設clear()方法對於清空數組列表更有效嗎?

使用arraylist.removeAll(arraylist)代替arraylist.clear()是否有任何警告?

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()更快,因為它不必處理所有這些額外的方法調用。

正如 Atrey 指出的那樣, c.contains(..)removeAll的時間復雜度增加到 O(n 2 ),而不是clear的 O(n)。

ArrayList.clear()的時間復雜度是O(n)removeAllO(n^2)

所以是的, ArrayList.clear要快得多。

clear()方法刪除單個ArrayList的所有元素。 這是一個快速操作,因為它只是將數組元素設置為null

AbstractCollection繼承的removeAll(Collection)方法從您調用該方法的集合中刪除參數集合中的所有元素。 這是一個相對較慢的操作,因為它必須搜索所涉及的 collections 之一。

除非有特定的優化來檢查傳遞給removeAll()的參數是否是集合本身(我非常懷疑是否存在這樣的優化),否則它將簡單的.clear()慢得多。

除此之外(至少同樣重要): arraylist.removeAll(arraylist)只是鈍的,令人困惑的代碼。 這是“清除此集合”的一種非常倒退的說法。 非常容易理解arraylist.clear()相比,它有什么優勢?

它們服務於不同的目的。 clear()清除 class 的實例, removeAll()刪除所有給定對象並返回操作的 state。

clear()將 go 通過底層 Array 並將每個條目設置為 null;

removeAll(collection)將 go 通過 ArrayList 檢查收集和remove(Object)如果它存在。

我想clear()比 removeAll 快得多,因為它沒有比較,等等。

Clear 更快,因為它不會遍歷要刪除的元素。 此方法可以假定所有元素都可以刪除。

Remove all並不一定意味着刪除列表中的所有元素,只有那些作為參數提供的元素應該被刪除。 因此,需要更多的努力來保留那些不應該刪除的內容。

澄清

通過“循環”,我的意思是它不必檢查是否應該保留元素。 它可以設置對null的引用,而無需搜索提供的要刪除的元素列表。

Cleardeleteall快。

clear() 會更有效率。 它只會刪除每個項目。 使用 removeAll(arraylist) 需要做更多的工作,因為它會在刪除之前檢查 arraylist 中的每個項目,看看它是否存在於 arraylist 中。

Array => 一旦在運行時為 Array 變量分配了空間,分配的空間就不能擴展或刪除。

ArrayList => 這不是 arraylist 的情況。 ArrayList 可以在運行時增長和收縮。 分配的空間可以在運行時最小化或最大化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM