如果你能帮我解决下一个问题,我将不胜感激。
我有这样的代码:
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中的集合保存的不是值,而是引用,因此在将其设置为集合后修改对象会导致它们在集合中进行修改。
是否有办法解决这个问题,并取得我前面提到的结果?
发布于 2022-07-06 08:03:31
您每次都可以将新的列表副本添加到您的设备中。
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获得。
如果使用list.stream().toList(),可以用list.stream().collect(Collectors.toList())替换java8+调用。
发布于 2022-07-06 07:59:02
您可以添加一个副本,而不是直接将列表添加到排队列中:
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));https://stackoverflow.com/questions/72879777
复制相似问题