我应该使用ArrayList.clear()还是创建一个新的列表?

3
所以,这篇文章是在继续之前的一篇文章:ArrayList.clear()和ArrayList.removeAll()有什么区别?...是否有某些情况下使用removeAll()比使用clear()更好?
此外,如果我知道要清除ArrayList的所有内容,将其设置为新的ArrayList是否可以?
ArrayList myList = new ArrayList<String>();

myList.add("a");
myList.add("b");

// instead of using:  myList.clear();
myList = new ArrayList<String>()

如果上述操作是可行的,那么为什么要使用clear()而不是设置一个新的ArrayList呢?创建一个新的空ArrayListO(n)更快。


3
是的,如果需要从当前列表中完全删除另一个列表中的所有元素,则应该使用removeAll方法。clearremoveAll是两种完全不同的方法,具有完全不同的用例。你几乎永远不会想要赋一个新的ArrayList而不是调用clear方法——例如,你怎么知道你拥有的List是一个ArrayList呢? - Boris the Spider
3个回答

10

为什么要使用 clear() 而不是创建一个新的 ArrayList?有几个原因:

  • 你可能不允许重新分配指向 ArrayList 的引用字段,因此可以清除现有列表但不能放入新列表。例如:

    class MyData {
        // Can clear() but not reassign
        final List<Object> list = new ArrayList<>();
    }
    
  • 变量可能被声明为List,实际类型可能是LinkedList,您想保留它而不是用ArrayList替换其实现。

  • clear()不一定是O(n)时间复杂度。一种实现策略是在O(n)时间内将后备数组中的所有现有元素置空。但另一种同样有效的实现是丢弃该内部数组并用新数组替换它,最好是一个短数组,可以做到O(1)时间复杂度。


1

没有ArrayList.removeAll()方法。 但是有一个ArrayList.removeAll(Collection)方法。

clear()方法应该比removeAll(Collection)方法快,因为removeAll(Collection)方法会进行一些比较来决定是否从列表中删除对象。 clear()方法只是简单地删除所有内容而不加思考。


这些方法完全是不同的,而且你正在回答的问题已经在链接的问题中得到了解答。你正在进行一种不恰当的比较,并没有回答问题。 - Boris the Spider

0
如果您想从列表中删除特定的集合,但又不想删除所有内容,您可以使用“remove all”与要删除的集合。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接