0

假设我有一个这样的列表:

private LinkedList<String> messages = new LinkedList<String>();

当我的方法第一次被调用时,这个列表中添加了一些字符串。而且我还有另一种方法,我需要从以前添加的值中清除此列表。要清除它,我可以使用:

messages.clear();

这将从列表中删除所有元素。我也可以像这样创建一个新实例:

messages = new LinkedList<String>();

哪种方式更适合清除列表?

4

8 回答 8

3
messages.clear();

实际上会清除列表,messages = new LinkedList<String>();只会设置messages为引用一个新的列表实例,因此您可能会争辩说第一种方法更“正确”来清除列表实例。

于 2012-11-28T15:45:15.123 回答
3

假设您有一个由两个变量 a 和 b 引用的列表。像这样(它们不必像这样彼此靠近,它们甚至可能在不同的文件中..):

final List<String> a = new LinkedList<String>();
final List<String> b = a;

现在,两者之间有很大的不同

a.clear();

这将使 a 和 b 引用相同的空列表,并且

a = new LinkedList<String>();

这将使'a'引用一个新的空列表,'b'引用旧的填充列表。(所以他们不引用相同的列表)。

由于您可能希望它们引用相同的列表,因此首选 a.clear(),因为当您查看 b 引用的列表时不会有任何意外(您可能认为它是空的,但结果是如果您使用新方法,则填充)。

于 2012-11-28T15:49:42.273 回答
2

我更喜欢第一种方法,即messages.clear();它清除了元素,但列表不会被破坏和重新创建。根据需要删除所有元素。

但是有一个副作用:它会迭代您的列表并一次删除一个项目,因此如果列表很大,那么这是不必要的开销。

    for (Node<E> x = first; x != null; ) {
        Node<E> next = x.next;
        x.item = null;
        x.next = null;
        x.prev = null;
        x = next;
    }
    first = last = null;
    size = 0;
    modCount++;

同样,第二种方法也有一个副作用:如果您在程序中的其他地方使用 r 列表的对象引用,则需要正确处理,否则您可能会得到一些意外的惊喜,例如,如果您将列表添加到其他对象/变量,那么第一种方法将清除引用它的每个地方的元素,而第二种方法则不会。

摘要:两种方法的结果在低级性质上是不同的;尽管它们似乎可以满足您的高级要求(清除列表)。根据您的低级别要求仔细决定。

于 2012-11-28T15:46:50.653 回答
1

它们几乎相似,但我想说messages.clear()更灵活。

第二种方法很简单并且被广泛使用,但是final你的列表中有修饰符的问题你不能那样清除它。

于 2012-11-28T15:46:26.693 回答
1
messages.clear();

效率更高。为了更安全,您可以询问此列表是否为空

于 2012-11-28T15:46:52.113 回答
1

我个人更喜欢使用LinkedList#clear,因为在阅读代码时可以更清楚地理解你在做什么。

但是它new LinkedList<String>();也可以正常工作。所以用什么就看你自己了!

于 2012-11-28T15:48:05.180 回答
0

第一个更可取。第二个给垃圾收集器带来了额外的负担。但第一个不是。

于 2012-11-28T15:46:51.027 回答
0

这显然取决于您的需要。

如果您想保留对列表对象实例的引用(例如,如果在其中调用 clear 方法的方法中调用messages是一个参数,那么调用 to.clear()是最好的解决方案。

另一方面,如果要清除的列表是当前方法所属对象的成员字段(或方法中的局部变量),则可以new LinkedList<String>();毫无问题地调用。

请注意,为了避免第一个(我倾向于不赞成),我通常总是返回我修改的对象作为修改它们的方法的结果。

于 2012-11-28T15:47:52.527 回答