假设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 次 |
最近记录: |