如何正确清除java中的列表

时间:2012-11-28 15:43:37

标签: java list

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

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

首次调用我的方法时,会在此列表中添加一些字符串。我还有另一种方法,我需要从以前添加的值中清除此列表。要清除它我可以使用:

messages.clear();

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

messages = new LinkedList<String>();

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

8 个答案:

答案 0 :(得分:3)

messages.clear();

实际上会清除列表,messages = new LinkedList<String>();只会将messages设置为引用新的列表实例,因此您可以认为第一种方法更清楚“清除列表实例”。

答案 1 :(得分: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引用的列表时您不会感到惊讶(您可能认为它是空的,但是转向如果使用新方法,则填充。

答案 2 :(得分:2)

我更喜欢第一种方法,即messages.clear();,因为它清除了元素,但List没有被销毁和重新创建。根据需要删除所有元素。

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

    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++;

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

摘要:两种方法的结果都是低级别的;虽然它们似乎满足您的高级要求(清除列表)。 根据您的低级要求仔细确定。

答案 3 :(得分:1)

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

第二种方法很简单且使用得很多,但是你的列表中有final修饰符的问题却无法清除它。

答案 4 :(得分:1)

messages.clear();

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

答案 5 :(得分:1)

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

new LinkedList<String>();也能正常运作。所以这取决于你使用什么!

答案 6 :(得分:0)

第一个是优选的。第二个对垃圾收集器造成额外负担。但第一个不是。

答案 7 :(得分:0)

这显然取决于你的需要。

如果要继续引用列表对象实例(例如,如果在messages是参数的方法中调用clear方法,则对.clear()的调用是最佳解决方案。

另一方面,如果要清除的列表是当前方法所属的对象的成员字段(或方法中的局部变量),那么您可以在没有任何内容的情况下调用new LinkedList<String>();麻烦。

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