假设arraylist被定义为ArrayList<String> arraylist,arraylist.removeAll(arraylist)相当于arraylist.clear()?
如果是这样,我可以假设该clear()方法更有效地清空数组列表吗?
使用中是否有任何警告arraylist.removeAll(arraylist)而不是arraylist.clear()?
Jef*_*rey 383
源代码clear():
public void clear() {
modCount++;
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
clear() 更快,因为它不必处理所有这些额外的方法调用.
正如Atrey指出的那样,c.contains(..)将时间复杂度removeAll增加到O(n ^ 2)而不是clear'O(n).
Ern*_*ill 14
该clear()方法删除单个元素的所有元素ArrayList.这是一个快速的操作,因为它只是设置一些数组元素null.
该removeAll(Collection)方法,这是从继承AbstractCollection,删除所有来自你调用方法收集的参数集合中的元素.这是一个相对较慢的操作,因为它必须搜索所涉及的其中一个集合.
除非有来检查,如果传递到参数的具体的优化removeAll()是集合本身(我高度怀疑,这样的优化是存在的),这将是显著不是一个简单的慢.clear().
除此之外(至少同样重要):arraylist.removeAll(arraylist)只是迟钝,令人困惑的代码.这是一种非常倒退的说法"清除此系列".它有什么优势可以理解 arraylist.clear()?
clear() 将遍历基础Array并将每个条目设置为null;
removeAll(collection)将通过ArrayList检查remove(Object)是否存在集合(如果存在)。
我想这clear()比removeAll快得多,因为它不在比较,等等。
| 归档时间: |
|
| 查看次数: |
370715 次 |
| 最近记录: |