假设arraylist定义为arraylist <String> arraylist,那么arraylist. removeall (arraylist)是否等价于arraylist.clear()?

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

使用arraylist. removeall (arraylist)而不是arraylist.clear()有什么注意事项吗?


当前回答

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

其他回答

Clear更快,因为它不遍历要删除的元素。该方法可以假定所有元素都可以删除。

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

澄清

所谓“循环”,我的意思是它不必检查元素是否应该被保留。它可以将引用设置为null,而无需搜索所提供的要删除的元素列表。

清除比删除全部快。

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

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

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(n2)的时间复杂度,而不是clear的O(n)。

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

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

除此之外(至少同样重要):arraylist. removeall (arraylist)只是一些笨拙的、令人困惑的代码。这是“清除这个集合”的一种非常倒退的说法。它比易于理解的arraylist.clear()有什么优势?