问题
假设arraylist
定义为ArrayList<String> arraylist
,isarraylist.removeAll(arraylist)
等效于arraylist.clear()
?
如果是这样,我可以假设theclear()
方法更有效地清空数组列表吗?
使用arraylist.removeAll(arraylist)
而不是arraylist.clear()
是否有任何警告?
#1 热门回答(323 赞)
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)。
#2 热门回答(41 赞)
时间复杂度为ArrayList.clear()
isO(n)
和removeAll
isO(n^2)
。
所以,是的,ArrayList.clear
要快得多。
#3 热门回答(10 赞)
clear()
方法删除了单个ArrayList
的所有元素。这是一个快速操作,因为它只是将一些数组元素设置为null
。
继承自AbstractCollection
的removeAll(Collection)
方法从你调用方法的集合中删除参数集合中的所有元素。这是一个相对较慢的操作,因为它必须搜索所涉及的其中一个集合。