-1
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
ArrayList<Integer> tmp = new ArrayList<Integer>();

tmp.add(1);
tmp.add(2);
tmp.add(3);
res.add(tmp);

然后我需要修改tmp:

tmp.remove(tmp.size() - 1);

如何在 res 中没有任何更改的情况下修改 tmp?因为如果我这样修改tmp,res中的内容也会被修改。我认为这与 Java 中的取消引用有关,并且可能是一个非常常见且重要的问题,所以有人可以帮助我吗?

4

3 回答 3

2

要不理会旧ArrayList的,请复制现有ArrayList并将其分配给tmp

tmp = new ArrayList<Integer>(tmp);

现在您可以在不影响旧列表的情况下处理列表的副本。

于 2013-11-04T23:43:41.293 回答
1

您必须制作副本并将副本List存储在:res

res.add(new ArrayList<Integer>(tmp));

请记住,虽然列表是副本,但列表中的对象是相同的。因此,如果您对一个列表中的对象进行更改,则副本中的对象也会更改。除非您对原始列表进行深层复制。

于 2013-11-04T23:46:35.177 回答
1

你正在寻找

res.add(new ArrayList<Integer>(tmp));

这个想法是创建对象的副本,而不是在多个地方使用相同的引用。

于 2013-11-04T23:43:34.727 回答