Java-List<Map>的复制 深拷贝与浅拷贝

博客背景是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/

猜你喜欢

转载自blog.csdn.net/weixin_44436677/article/details/132916180