ArrayList.clear()和ArrayList.removeAll()有什么区别?
假设arraylist
定义为ArrayList<String> arraylist
,是arraylist.removeAll(arraylist)
相当于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()
的源代码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)。
ArrayList.clear()
的时间复杂度为O(n)
, removeAll
的时间复杂度为O(n^2)
。
所以是的, ArrayList.clear
更快。
除非有特定的优化检查传递给removeAll()
的参数是否是集合本身(我非常怀疑这样的优化是否存在),否则它将比简单的.clear()
慢得多。
除此之外( 至less同样重要): arraylist.removeAll(arraylist)
只是一个混淆的代码。 这是一个非常倒退的方式说“清除这个集合”。 对于可理解的 arraylist.clear()
有什么好处?
clear()
方法删除单个ArrayList
所有元素。 这是一个快速的操作,因为它只是将一些数组元素设置为null
。
从AbstractCollection
inheritance的removeAll(Collection)
方法从您调用方法的集合中删除参数集合中的所有元素。 这是一个相对缓慢的操作,因为它必须search涉及的一个集合。
他们有两个不同的目的。 clear()
只是清除类的一个实例, removeAll()
移除所有给定的对象并返回操作的状态。
clear()
将通过基础数组并将每个条目设置为null;
removeAll(collection)
将通过ArrayList检查收集并remove(Object)
它是否存在。
我会想象clear()
是更快然后removeAll因为它不是比较等
clear()会更有效率。 它会简单地删除每个项目。 使用removeAll(arraylist)将需要更多的工作,因为它将检查arraylist中的每个项目,看它是否存在于arraylist中,然后再删除它。
清除更快,因为它不会遍历要删除的元素。 这个方法可以假定所有元素都可以被删除。
Remove all
并不一定意味着删除列表中的所有元素,只有那些作为参数提供的应该删除。 因此,需要更多的努力来保留那些不应该被删除的东西。
澄清
通过“循环”,我的意思是不必检查元素是否应该保留。 它可以将引用设置为null
而无需search所提供的要删除的元素列表。
Clear
IS比deleteall
更快。
一旦在运行时为数组variables分配空间,则分配的空间不能被扩展或删除。
ArrayList =>这不是ArrayList的情况。 ArrayList可以在运行时增长和缩小。 分配的空间可以在运行时最小化或最大化。