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

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

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


当前回答

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

在ArrayList中不是这样的。ArrayList可以在运行时增长和收缩。 分配的空间可以在运行时最小化或最大化。

其他回答

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

ArrayList.clear()的时间复杂度为O(n), removeAll的时间复杂度为O(n²)。

是的,数组列表。Clear要快得多。

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

在ArrayList中不是这样的。ArrayList可以在运行时增长和收缩。 分配的空间可以在运行时最小化或最大化。

Clear()将更加高效。它会简单地删除每一个项目。使用removeAll(arraylist)将需要更多的工作,因为它将检查数组列表中的每个项,在删除它之前查看它是否存在于数组列表中。

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