![](/img/trans.png)
[英]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.