answer.add(new ArrayList(paths))和answer.add(paths)的区别
背景:
假设有如下两个列表:
List<Integer> paths = new ArrayList<>();
List<List<Integer>> answer = new ArrayList<>();
在将 paths 添加到 answer 时,有两种常见的写法:
answer.add(new ArrayList<>(paths));
answer.add(paths);
这两种写法的区别主要在于它们处理 paths 对象的方式不同。
- answer.add(new ArrayList<>(paths));
浅拷贝方式:此代码通过 new ArrayList<>(paths) 创建了 paths 列表的一个副本(浅拷贝),然后将这个副本添加到 answer 中。
效果:
answer 中添加的并不是原始的 paths,而是它的一个拷贝。
如果后续对 paths 进行修改,这些修改不会影响到 answer 中已经添加的副本。
适用场景:当需要保存 paths 的当前状态,并且不希望后续对 paths 的修改影响 answer 中已有的内容时使用。 - answer.add(paths);
引用方式:此代码直接将 paths 的引用添加到 answer 中。
效果:
answer 中添加的不是 paths 的副本,而是指向 paths 的引用。
如果后续对 paths 进行修改,answer 中的相应位置也会跟着改变,因为它们共享同一个引用。
适用场景:当希望 answer 中的列表跟随 paths 的变化而动态更新时使用。
总结:
answer.add(new ArrayList<>(paths));:创建并添加的是 paths 的副本,后续修改 paths 不会影响到 answer 中已经添加的元素。
answer.add(paths);:直接添加 paths 的引用,后续修改 paths 会影响到 answer 中所有引用该对象的元素。