博客背景是Java开发。讲一讲List< Map>的复制中深拷贝与浅拷贝。
1、浅拷贝
Map除了基本类型是值传递,其余的都是引用地址传递。
由于map的value存储的引用地址传递(list),所以当list对象的内部属性发生改变时,map中的value随着改变,该方式属于浅拷贝。
举个例子:list1浅拷贝成list2,Java中内容相同的数组指向同一地址,即list1与浅拷贝后的list2指向同一地址。这样会带来的影响在于如果改变list2的话,同时也会改变list1。因为改变list2就是改变其所指向地址的内容,而list1也指向同一地址,所以list1与list2会一起改变。
如下代码示例,有三种方式可以实现浅拷贝:
1.1循环遍历复制
//方法一:循环遍历复制
List<Map<String, Object>> list2 = new ArrayList<>(list1.size());
for (Map<String, Object> map : list1) {
listt2.add(map);
}
1.2 使用list实现类的构造方法
//方法二:使用list实现类的构造方法
List<Map<String, Object>> list2 = new ArrayList<>(list1);
1.3 addAll方法
//方法三:使用addAll
List<Map<String, Object>> list2 = new ArrayList<>();
list2.addAll(list1);
2、深拷贝
如果不想改变原map中的值,可以使用反射原理做深拷贝处理。其原理是在内存中开辟一块新的内存地址,所以不会改变旧地址上的值。
举个例子,深拷贝是将list1复制给list2的同时,给list2创建新的地址,再将list1地址的内容传递到list2地址。这样就会使得list1与list2的内容一致,但由于他们所指向的地址不同,所以改变相互不受影响。
深拷贝工具类 SerializationUtils.clone
commons-lang-2.6.jar
例如:Object obj = SerializationUtils.clone( objectFrom )
代码示例如下,使用深拷贝工具类实现
List<HashMap<String, Object>> list2 = new ArrayList<>();
for (Map<String, Object> hashMap : list1) {
list2.add((HashMap<String, Object>) SerializationUtils.clone((Serializable) hashMap));
}
参考:
https://blog.csdn.net/VIP099/article/details/108633345
https://blog.csdn.net/shy415502155/article/details/106048557/