[英]Why is ArrayList.clear()/ArrayList.removeAll() clearing both lists I've declared?
[英]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)
而removeAll
是O(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
的引用,而無需搜索提供的要刪除的元素列表。
Clear
比deleteall
快。
clear() 會更有效率。 它只會刪除每個項目。 使用 removeAll(arraylist) 需要做更多的工作,因為它會在刪除之前檢查 arraylist 中的每個項目,看看它是否存在於 arraylist 中。
Array => 一旦在運行時為 Array 變量分配了空間,分配的空間就不能擴展或刪除。
ArrayList => 這不是 arraylist 的情況。 ArrayList 可以在運行時增長和收縮。 分配的空間可以在運行時最小化或最大化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.