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

时间:2011-08-11 20:01:17

标签: java arraylist

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

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

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

9 个答案:

答案 0 :(得分:361)

clear()的源代码:

public void clear() {
    modCount++;

    // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null;

    size = 0;
}

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

答案 1 :(得分:45)

ArrayList.clear() O(n)removeAll的时间复杂度为O(n^2)

是的,ArrayList.clear要快得多。

答案 2 :(得分:14)

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

继承自removeAll(Collection)的{​​{1}}方法从您调用方法的集合中删除参数集合中的所有元素。这是一个相对较慢的操作,因为它必须搜索所涉及的一个集合。

答案 3 :(得分:7)

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

答案 4 :(得分:7)

除非有特定的优化来检查传递给removeAll()的参数是否是集合本身(并且我高度怀疑这样的优化是否存在),否则它将是显着比简单.clear()慢。

除此之外(至少同样重要):arraylist.removeAll(arraylist)只是迟钝,令人困惑的代码。这是一种非常倒退的说法“清除此系列”。它对非常容易理解的 arraylist.clear()有什么好处?

答案 5 :(得分:4)

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

removeAll(collection)将通过ArrayList检查集合,如果它存在则remove(Object)

我认为clear()比removeAll更快,因为它不是比较等。

答案 6 :(得分:2)

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

Remove all并不一定意味着删除列表中的所有元素,只有那些作为参数提供的元素应该被删除。因此,需要付出更多努力来保留那些不应删除的内容。

<强>澄清

通过'loop',我的意思是它不必检查元素是否应该保留。它可以设置对null的引用,而无需搜索提供的要删除的元素列表。

Cleardeleteall快。

答案 7 :(得分:1)

clear()会更有效率。它只会删除每个项目。使用removeAll(arraylist)会花费更多的工作,因为它会检查arraylist中的每个项目,看它是否存在于arraylist中,然后才能删除它。

答案 8 :(得分:-8)

Array =&gt;一旦在运行时为Array变量分配了空间,就无法扩展或删除分配的空间。

ArrayList =&gt;在arraylist中并非如此。 ArrayList可以在运行时增长和缩小。              分配的空间可以在运行时最小化或最大化。