arraylist.removeAll(arraylist)
清除该类的实例,arraylist.clear()
清除所有给定的对象并返回操作状态。假设arraylist
定义为ArrayList<String> arraylist
,arraylist.removeAll(arraylist)
是否等于arraylist.removeAll(arraylist)
?
如果是这样,我可以假定arraylist.clear()
方法更有效地清空数组列表吗?
使用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
更快,因为它不必处理所有这些额外的方法调用。
并且正如Atrey所指出的,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()
的时间复杂度增加到O(n 2),而不是c.contains(..)
的O(n)。
removeAll
的时间复杂度为clear
,ArrayList.clear()
的时间复杂度为O(n)
。
所以,removeAll
快很多。
O(n^2)
方法将删除单个ArrayList.clear
的所有元素。这是一个快速的操作,因为它只是将数组元素设置为clear()
。
ArrayList
方法是从null
继承的,将从调用该方法的集合中删除参数集合中的所有元素。这是一个相对较慢的操作,因为它必须搜索所涉及的集合之一。
除非有一个特定的优化检查传递给 至少removeAll(Collection)
的参数是否是集合本身(并且我高度怀疑是否存在这样的优化),它会比简单地慢[[显着]] AbstractCollection
。除此之外(和removeAll()
只是令人费解的代码。说“清除此收藏集”是一种非常落后的方式。与非常容易理解 .clear()
相比,它有什么优势?
arraylist.removeAll(arraylist)
清除该类的实例,arraylist.clear()
清除所有给定的对象并返回操作状态。clear()
将遍历基础数组并将每个条目设置为null;removeAll()
将通过ArrayList检查收集,如果存在,则clear()
进行检查。
我想removeAll(collection)
比removeAll快得多,因为它没有进行比较,等等。
remove(Object)
不一定意味着删除列表中的所有元素,仅应删除作为参数提供的元素。因此,需要付出更多的努力来保留不应删除的内容。
澄清
通过“循环”,我的意思是不必检查是否应保留该元素。它可以在不搜索提供的要删除元素列表的情况下将参考设置为clear()
。[Remove all
比null
快。
ArrayList =>在arraylist中不是这种情况。 ArrayList可以在运行时增长和收缩。可以在运行时最小化或最大化已分配的空间。
arraylist.removeAll(arraylist)
清除该类的实例,arraylist.clear()
清除所有给定的对象并返回操作状态。clear()
将遍历基础数组并将每个条目设置为null;