1. Java中深拷贝List
在Java开发中,我们经常遇到需要复制集合对象的情况。特别是当集合中包含Map这类引用类型时,简单的赋值操作会导致新旧对象共享同一内存地址,这就是所谓的"浅拷贝"问题。今天我要分享的是一个在实际项目中验证过的List
先看一个典型场景:我们从数据库查询得到一个List
java复制List<Map<String, Object>> newAnalysis = generalAnalysis.stream()
.map(originalMap -> new HashMap<>(originalMap))
.collect(Collectors.toList());
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 深拷贝原理与实现细节
2.1 为什么需要深拷贝
Java中的集合类存储的都是对象引用。当我们直接赋值一个List时:
java复制List<Map<String, Object>> copy = originalList;
这实际上只是复制了引用,两个变量指向同一个List对象。同样,List中的Map元素也是共享的。这种浅拷贝会导致修改copy中的元素时,originalList中的对应元素也会被修改。
2.2 流式操作实现深拷贝
我们使用的解决方案结合了Java 8的Stream API和HashMap的构造方法:
stream()- 将List转换为流,便于进行元素级操作map()- 对每个Map元素进行处理new HashMap<>(originalMap)- 利用HashMap的拷贝构造函数创建新Mapcollect(Collectors.toList())- 将流重新收集为List
关键点在于new HashMap<>(originalMap),这个构造函数会创建一个新的HashMap实例,并将原Map中的所有键值对复制到新Map中。对于值对象,如果
