有没有一种方法可以清空ArrayList但不失去内存引用?

3

这是我代码的相关部分:

    List<List<String>> list2 = new ArrayList<>();
    public void process(List<String> z) {
        if (z.size() > 0) {
            String x = z.get(0);

            List<String> temp = new ArrayList<>();

            z.stream().filter(e -> !e.equals(x)).forEach(e -> {
                // some operations on temp
            });

            list2.add(temp);                   // adding temp to list2

            z.removeIf(e -> temp.contains(e));
            temp.clear();                      // clearing temp

            z.forEach(System.out::println);
            list2.forEach((System.out::println));   // empty list2

            process(z);
            list2.forEach(e -> process(e));
    }

我需要在递归调用“process”之前清除临时变量。问题在于,当我清除“temp”时,我的“list2”变为空。
由于我在lambda表达式中使用了“temp”,因此我不能将其重新分配为“null”或“new ArrayList<>”(否则它就可以工作了)。

我考虑创建一个新的列表,并在“temp”和新列表之间进行复制,但这不是一个合适的方法。
还有其他方法吗?

1
“在递归调用process之前,我必须清除临时文件。” - 为什么? - Turing85
1
@DHS那不是理由。temp引用了一个也存储在list2中的列表,这有什么问题呢? - Turing85
5
temp是一个局部变量。每次递归调用都会有自己的temp副本。不需要清空它。事实上,循环的每次迭代都会有一个新的temp变量。 - Turing85
2
z.removeIf(e -> temp.contains(e))z.removeAll(temp) 的一个效率较低的版本。通常来说,你似乎有过度使用 lambda 表达式的习惯。 - Holger
1
只有了解API才能摆脱困境... - Holger
显示剩余5条评论
1个回答

3
虽然这个答案解决了当列表在另一个列表中时清除列表的问题,但真正的答案在Turing85的评论中,因为没有必要清除temp,因为temp是一个本地变量。
如果你想清除temp但不清除你插入list2的条目,就不能将temp插入list2然后清除temp,因为templist2中的条目都指向同一个列表。
相反,插入一份副本:
list2.add(new ArrayList<>(temp));

当你清空temp时,放入list2的新列表将不受影响。


@DHS - 不用谢。不过,Turing85说得很对,你可能根本不需要清除“temp”... :-) - T.J. Crowder

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