假设arraylist
定义为ArrayList<String> arraylist
,arraylist.removeAll(arraylist)
是否等同于arraylist.clear()
?
如果是这样,我可以假设clear()
方法更有效地清空数组列表吗?
使用arraylist.removeAll(arraylist)
代替arraylist.clear()
时是否有任何警告?
答案 0 :(得分:361)
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)。
答案 1 :(得分:45)
ArrayList.clear()
O(n)
和removeAll
的时间复杂度为O(n^2)
。
是的,ArrayList.clear
要快得多。
答案 2 :(得分:14)
clear()
方法会删除单个ArrayList
的所有元素。这是一个快速操作,因为它只是将一些数组元素设置为null
。
继承自removeAll(Collection)
的{{1}}方法从您调用方法的集合中删除参数集合中的所有元素。这是一个相对较慢的操作,因为它必须搜索所涉及的一个集合。
答案 3 :(得分:7)
它们用于不同的目的。 clear()
清除类的实例,removeAll()
删除所有给定的对象并返回操作的状态。
答案 4 :(得分:7)
除非有特定的优化来检查传递给removeAll()
的参数是否是集合本身(并且我高度怀疑这样的优化是否存在),否则它将是显着比简单.clear()
慢。
除此之外(至少同样重要):arraylist.removeAll(arraylist)
只是迟钝,令人困惑的代码。这是一种非常倒退的说法“清除此系列”。它对非常容易理解的 arraylist.clear()
有什么好处?
答案 5 :(得分:4)
clear()
将遍历底层数组并将每个条目设置为null;
removeAll(collection)
将通过ArrayList检查集合,如果它存在则remove(Object)
。
我认为clear()
比removeAll更快,因为它不是比较等。
答案 6 :(得分:2)
清除速度更快,因为它不会循环删除要删除的元素。此方法可以假定可以删除所有元素。
Remove all
并不一定意味着删除列表中的所有元素,只有那些作为参数提供的元素应该被删除。因此,需要付出更多努力来保留那些不应删除的内容。
<强>澄清强>
通过'loop',我的意思是它不必检查元素是否应该保留。它可以设置对null
的引用,而无需搜索提供的要删除的元素列表。
Clear
比deleteall
快。
答案 7 :(得分:1)
clear()会更有效率。它只会删除每个项目。使用removeAll(arraylist)会花费更多的工作,因为它会检查arraylist中的每个项目,看它是否存在于arraylist中,然后才能删除它。
答案 8 :(得分:-8)
Array =&gt;一旦在运行时为Array变量分配了空间,就无法扩展或删除分配的空间。
ArrayList =&gt;在arraylist中并非如此。 ArrayList可以在运行时增长和缩小。 分配的空间可以在运行时最小化或最大化。