繁体   English   中英

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

[英]What is the difference between ArrayList.clear() and ArrayList.removeAll()?

Assuming that arraylist is defined as ArrayList<String> arraylist , is arraylist.removeAll(arraylist) equivalent to arraylist.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中定义):

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

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

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

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

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

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

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

它们服务于不同的目的。 clear()清除 class 的实例, removeAll()删除所有给定对象并返回操作的 state。

clear()将 go 通过底层 Array 并将每个条目设置为 null;

removeAll(collection)将 go 通过 ArrayList 检查收集和remove(Object)如果它存在。

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

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

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

澄清

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

Cleardeleteall快。

clear() 会更有效率。 它只会删除每个项目。 使用 removeAll(arraylist) 需要做更多的工作,因为它会在删除之前检查 arraylist 中的每个项目,看看它是否存在于 arraylist 中。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM