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

ate*_*iob 274 java arraylist

假设arraylist被定义为ArrayList<String> arraylist,arraylist.removeAll(arraylist)相当于arraylist.clear()

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

使用中是否有任何警告arraylist.removeAll(arraylist)而不是arraylist.clear()

Jef*_*rey 383

源代码clear():

public void clear() {
    modCount++;

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

    size = 0;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

clear() 更快,因为它不必处理所有这些额外的方法调用.

正如Atrey指出的那样,c.contains(..)将时间复杂度removeAll增加到O(n ^ 2)而不是clear'O(n).

  • 注意`c.contains(...)`平方操作的时间复杂度会使这个答案完整. (29认同)
  • 这个来源很强大.(对于所有其他答案:使用源代码,Luke.)注意clear()如何实现为一行,size = 0; 但垃圾收集不会知道收集数组中无法到达的部分中的元素. (7认同)
  • e.remove()更复杂!e.remove()也使复杂性正方形,就像c.contains(...)那样.在ArrayList上,e.remove()调用ArrayList.remove(int index),它必须将数组的其余部分移位一. (2认同)
  • @julius如果它这样做:`size = 0; elementData = new Object [10];`其余的都将被垃圾收集,因为后备数组没有外部引用. (2认同)

Geo*_*off 50

的时间复杂度ArrayList.clear()IS O(n)和的removeAllO(n^2).

所以是的,ArrayList.clear速度要快得多.


Ern*_*ill 14

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

removeAll(Collection)方法,这是从继承AbstractCollection,删除所有来自你调用方法收集的参数集合中的元素.这是一个相对较慢的操作,因为它必须搜索所涉及的其中一个集合.

  • @Farid对不起,我的英语在这里太随意了。我的确意味着将所有元素设置为null。我会解决的! (2认同)

luc*_*tte 7

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


Joa*_*uer 7

除非有来检查,如果传递到参数的具体的优化removeAll()是集合本身(我高度怀疑,这样的优化是存在的),这将是显著不是一个简单的慢.clear().

除此之外(至少同样重要):arraylist.removeAll(arraylist)只是迟钝,令人困惑的代码.这是一种非常倒退的说法"清除此系列".它有什么优势可以理解 arraylist.clear()


Nic*_*las 5

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

removeAll(collection)将通过ArrayList检查remove(Object)是否存在集合(如果存在)。

我想这clear()比removeAll快得多,因为它不在比较,等等。