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

AbstractCollectioninheritance的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可以在运行时增长和缩小。 分配的空间可以在运行时最小化或最大化。