假设arraylist定义为arraylist <String> arraylist,那么arraylist. removeall (arraylist)是否等价于arraylist.clear()?
如果是这样,我是否可以假设clear()方法更有效地清空数组列表?
使用arraylist. removeall (arraylist)而不是arraylist.clear()有什么注意事项吗?
假设arraylist定义为arraylist <String> arraylist,那么arraylist. removeall (arraylist)是否等价于arraylist.clear()?
如果是这样,我是否可以假设clear()方法更有效地清空数组列表?
使用arraylist. removeall (arraylist)而不是arraylist.clear()有什么注意事项吗?
当前回答
clear()将遍历底层数组并将每个条目设置为null;
removeAll(collection)将通过ArrayList检查集合并删除(Object)它,如果它存在。
我认为clear()比removeAll快得多,因为它没有比较,等等。
其他回答
clear()将遍历底层数组并将每个条目设置为null;
removeAll(collection)将通过ArrayList检查集合并删除(Object)它,如果它存在。
我认为clear()比removeAll快得多,因为它没有比较,等等。
Array =>一旦在运行时为Array变量分配了空间,分配的空间就不能扩展或删除。
在ArrayList中不是这样的。ArrayList可以在运行时增长和收缩。 分配的空间可以在运行时最小化或最大化。
Clear更快,因为它不遍历要删除的元素。该方法可以假定所有元素都可以删除。
Remove all并不一定意味着删除列表中的所有元素,只应该删除那些作为参数提供的元素。因此,需要更多的努力来保留那些不应该删除的。
澄清
所谓“循环”,我的意思是它不必检查元素是否应该被保留。它可以将引用设置为null,而无需搜索所提供的要删除的元素列表。
清除比删除全部快。
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(n2)的时间复杂度,而不是clear的O(n)。
它们有不同的用途。clear()清除类的一个实例,removeAll()删除所有给定对象并返回操作的状态。