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

问题

假设arraylist定义为ArrayList<String> arraylist,isarraylist.removeAll(arraylist)等效于arraylist.clear()

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

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


#1 热门回答(323 赞)

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


#2 热门回答(41 赞)

时间复杂度为ArrayList.clear()isO(n)removeAllisO(n^2)

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


#3 热门回答(10 赞)

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

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