ArrayList.clear()和ArrayList.removeAll()有什么区别?

问题描述 投票:-2回答:1

假设arraylist定义为ArrayList<String> arraylistarraylist.removeAll(arraylist)是否等于arraylist.removeAll(arraylist)

如果是这样,我可以假定arraylist.clear()方法更有效地清空数组列表吗?

使用arraylist.clear()代替clear()是否有任何警告?

java arraylist clear removeall
1个回答
389
投票

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()

AbstractCollection更快,因为它不必处理所有这些额外的方法调用。

并且正如Atrey所指出的,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()的时间复杂度增加到O(n 2),而不是c.contains(..)的O(n)。


51
投票

removeAll的时间复杂度为clearArrayList.clear()的时间复杂度为O(n)

所以,removeAll快很多。


14
投票

O(n^2)方法将删除单个ArrayList.clear的所有元素。这是一个快速的操作,因为它只是将数组元素设置为clear()

ArrayList方法是从null继承的,将从调用该方法的集合中删除参数集合中的所有元素。这是一个相对较慢的操作,因为它必须搜索所涉及的集合之一。


7
投票

除非有一个特定的优化检查传递给removeAll(Collection)的参数是否是集合本身(并且我高度怀疑是否存在这样的优化),它会比简单地慢[[显着]] AbstractCollection除此之外(和

至少

同样重要):removeAll()只是令人费解的代码。说“清除此收藏集”是一种非常落后的方式。与非常容易理解 .clear()相比,它有什么优势?

它们有不同的用途。 arraylist.removeAll(arraylist)清除该类的实例,arraylist.clear()清除所有给定的对象并返回操作状态。

clear()将遍历基础数组并将每个条目设置为null;

removeAll()将通过ArrayList检查收集,如果存在,则clear()进行检查。

我想removeAll(collection)比removeAll快得多,因为它没有进行比较,等等。

清除速度更快,因为它不会循环显示要删除的元素。此方法可以假定可以删除所有元素。

remove(Object)不一定意味着删除列表中的所有元素,仅应删除作为参数提供的元素。因此,需要付出更多的努力来保留不应删除的内容。

澄清

通过“循环”,我的意思是不必检查是否应保留该元素。它可以在不搜索提供的要删除元素列表的情况下将参考设置为clear()

[Remove allnull快。

clear()将更加高效。它只会删除每个项目。使用removeAll(arraylist)会花费更多的工作,因为它将在删除它之前检查arraylist中的每个项目以查看是否存在于arraylist中。

Array =>一旦在运行时为Array变量分配了空间,就不能扩展或删除分配的空间。

ArrayList =>在arraylist中不是这种情况。 ArrayList可以在运行时增长和收缩。可以在运行时最小化或最大化已分配的空间。


7
投票
它们有不同的用途。 arraylist.removeAll(arraylist)清除该类的实例,arraylist.clear()清除所有给定的对象并返回操作状态。

5
投票
clear()将遍历基础数组并将每个条目设置为null;

2
投票
清除速度更快,因为它不会循环显示要删除的元素。此方法可以假定可以删除所有元素。

1
投票
clear()将更加高效。它只会删除每个项目。使用removeAll(arraylist)会花费更多的工作,因为它将在删除它之前检查arraylist中的每个项目以查看是否存在于arraylist中。

-8
投票
Array =>一旦在运行时为Array变量分配了空间,就不能扩展或删除分配的空间。
© www.soinside.com 2019 - 2024. All rights reserved.