首先说一下深拷贝和浅拷贝的区别:
浅拷贝就是复制出来了一个list,但是它们指向同一地址,所以一旦一个变了,另一个也会跟着改变。
深拷贝则不共享地址,不会被对方影响。
平常使用过程中如果涉及到修改还是需要注意一下场景适合使用深拷贝还是浅拷贝,不涉及就无所谓了。
浅拷贝:
for (User user : userList1) {
userList2.add(user);
}
直接使用List的addAll方法也属于浅拷贝:
List<User> userList2=new ArrayList<User>();
userList2.addAll(userList1);
深拷贝:
List<Integer> oldList = new ArrayList<>();//假设已对oldList赋值
List<Integer> newList = new ArrayList<>();
Collections.addAll(newList, new Integer[oldList.size()]);
Collections.copy(newList, list);
注意在这里需要Collections.addAll(newList, new Integer[oldList.size()]);的原因:
List始化时size的大小永远默认为0,只有在进行add和remove等相关操作 时,size的大小才变化。然而进行copy()时候,首先做的是将newList的size和src的oldList大小进行比较,只有当newList的 size 大于或者等于oldList的size时才进行拷贝,否则抛出IndexOutOfBoundsException异常;