3

可能重复:
list.clear() vs list = new ArrayList<int>();

我有一个清单:

List<Integer> l1  = new ArrayList<Integer>();

并在该列表中添加了一些整数变量。经过一些操作后,我需要重用该列表,因此我将其设置为null.

哪个更好,设置null或使用.clear()?还是有其他方法?

4

5 回答 5

2
  1. l1 = null将破坏对列表对象的引用,并将被垃圾收集(假设没有其他对 的引用List)。

  2. l1.clear()将迭代整个列表并清除其所有值(即将每个索引处的对象设置为null)。

第一个不需要遍历整个列表,因此通常更快。如果出于某种原因需要重用该List对象,则应使用l1.clear()从列表中删除对象。

于 2012-07-02T14:58:20.240 回答
2

l1 = null;将 null 分配给l1变量。如果该列表之前已存储在另一个对象中,则该另一个对象仍然具有对该列表的引用,因此仍然可以访问存储在该列表中的所有元素。如果之前引用的 List 对象对象l1不再可访问,它将被垃圾回收。它的元素也是如此:如果它们不再可访问,它们将被垃圾收集。

l1.clear();非常不同:它从列表中删除所有元素。如果该列表之前已存储在另一个对象中,则此另一个对象具有对您刚刚清除的列表的引用,因此无法再访问存储在列表中的元素(因为您删除了它们)。如果之前存储在列表中的元素不再可访问,它们将被垃圾回收。该列表不会出现,因为您保留了对它的引用 ( l1)。

因此,l1 = null如果要重用变量,但要保持 List对象原样,则应使用 , 。l1.clear()如果要从列表中删除所有元素,则应使用。

于 2012-07-02T15:00:14.090 回答
0

您是要清除列表的内容,还是从新维度、新数组重新开始?只是垃圾收集数组并调用 l1 = new Array(); 并且您将生成一个具有空值的新数组,而不是遍历并尝试清除整个列表。

于 2012-07-02T14:56:03.503 回答
0

如果您使用的是LinkedList,clear()将会非常快并且迭代也非常快。但是单次访问会慢一些。您的选择取决于用例...

于 2012-07-02T14:57:05.670 回答
0

如果将其设置为null,则必须在使用前再次对其进行初始化。所以我会这样做:

l1  = new ArrayList<Integer>();

我认为这会比打电话更快.clear()

于 2012-07-02T14:59:56.613 回答