将值设置为集合而不是引用



如果您能帮助我解决下一个问题,我将不胜感激。

我有这样的代码:

List<Integer> list = new ArrayList<>();
list.add(5);
list.add(7);
list.add(9);
Deque<List<Integer>> deque = new ArrayDeque<>();
deque.addLast(list);
list.add(11);
deque.addLast(list);
list.add(13);
deque.addLast(list);
deque.stream().forEach(System.out::println)

我需要得到下一个结果:

[5, 7, 9]
[5, 7, 9, 11]
[5, 7, 9, 11, 13]

然而,实际的结果是:

[5, 7, 9, 11, 13]
[5, 7, 9, 11, 13]
[5, 7, 9, 11, 13]

我研究这个问题,发现核心问题是在Java集合保存值但所以修改对象的引用设置其集合原因修改后集合。

有没有办法解决这个问题,并得到我上面提到的结果?

你可以每次都给deque添加新的list副本:

Deque<List<Integer>> deque = new ArrayDeque<>();
deque.addLast(list.stream().toList());
list.add(11);
deque.addLast(list.stream().toList());
list.add(13);
deque.addLast(list.stream().toList());
deque.stream().forEach(System.out::println);

注意:toList()可以从java16中获得。

如果您使用java8+,可以将list.stream().toList()调用替换为list.stream().collect(Collectors.toList())

出列而不是直接添加列表,你可以添加一个副本:

Deque<List<Integer>> deque = new ArrayDeque<>();
deque.addLast(new ArrayList<>(list));
list.add(11);
deque.addLast(new ArrayList<>(list));
list.add(13);
deque.addLast(new ArrayList<>(list));

最新更新