假设arraylist被定义为ArrayList<String> arraylist,那么arraylist.removeAll(arraylist)是否等同于arraylist.clear()?
arraylist
ArrayList<String> arraylist
arraylist.removeAll(arraylist)
arraylist.clear()
如果是这样,我是否可以假设clear()方法更有效地清空数组列表?
clear()
用arraylist.removeAll(arraylist)代替arraylist.clear()有什么注意事项吗?
Clear更快,因为它不遍历要删除的元素。该方法可以假定所有元素都可以删除。
Remove all并不一定意味着删除列表中的所有元素,只应该删除那些作为参数提供的元素。因此,需要更多的努力来保留那些不应该删除的。
Remove all
澄清
所谓“循环”,我的意思是它不必检查元素是否应该被保留。它可以将引用设置为null,而无需搜索所提供的要删除的元素列表。
null
Clear比deleteall快。
Clear
deleteall
它们有不同的用途。clear()清除类的一个实例,removeAll()删除所有给定对象并返回操作的状态。
removeAll()
除非有一个特定的优化来检查传递给removeAll()的参数是否是集合本身(并且我高度怀疑这样的优化是否存在),否则它将比简单的.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()的源代码(在AbstractCollection中定义):
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(n2)的时间复杂度,而不是clear的O(n)。
c.contains(..)
removeAll
clear
Clear()将更加高效。它会简单地删除每一个项目。使用removeAll(arraylist)将需要更多的工作,因为它将检查数组列表中的每个项,在删除它之前查看它是否存在于数组列表中。
ArrayList.clear()的时间复杂度是O(n), removeAll的时间复杂度是O(n^2)。
ArrayList.clear()
O(n)
O(n^2)
所以是的,ArrayList.clear要快得多。
ArrayList.clear
clear()方法删除单个ArrayList中的所有元素。这是一个快速操作,因为它只是将数组元素设置为null。
ArrayList
removeAll(Collection)方法继承自AbstractCollection,它从调用该方法的集合中删除参数集合中的所有元素。这是一个相对较慢的操作,因为它必须搜索所涉及的一个集合。
removeAll(Collection)
clear()将遍历底层数组并将每个条目设置为null;
removeAll(collection)将通过数组列表检查集合,如果它存在remove(Object)。
removeAll(collection)
remove(Object)
我会想象clear()比removeAll快得多,因为它没有比较,等等。
Array =>一旦在运行时为Array变量分配了空间,分配的空间就不能扩展或删除。