Java中如何完全复制值为集合类型的TreeMap?
实现TreeMap的深拷贝(非浅拷贝)
你遇到的问题是:使用clone()、new TreeMap<>(treeMap1)或putAll()都是浅拷贝,仅复制了TreeMap的结构,但内部的SortedSet实例还是和原Map共享的,所以修改副本里的集合时,原Map的集合也会跟着变。要实现真正的独立拷贝,必须把每个值对应的集合也单独复制一份。
下面是两种可行的实现方式:
方法一:手动遍历复制
直接遍历原TreeMap的每个键值对,为每个SortedSet创建新的副本,再放入新的TreeMap中:
private static void initializeTreeMap2() { treeMap2 = new TreeMap<>(); for (Map.Entry<Integer, SortedSet<Integer>> entry : treeMap1.entrySet()) { // 基于原集合创建新的TreeSet副本 SortedSet<Integer> copiedSet = new TreeSet<>(entry.getValue()); treeMap2.put(entry.getKey(), copiedSet); } }
方法二:使用Stream流式处理(Java 8+)
用流API更简洁地完成深拷贝:
private static void initializeTreeMap2() { treeMap2 = treeMap1.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> new TreeSet<>(entry.getValue()), // 复制每个集合 (oldVal, newVal) -> oldVal, // TreeMap键唯一,此逻辑不会触发 TreeMap::new // 指定结果容器为TreeMap )); }
修改后的代码运行test()方法时,treeMap1的输出不会包含99,因为treeMap2里的集合是完全独立的副本。
注意:如果你的
SortedSet中存放的是自定义对象,还需要确保自定义对象本身也实现深拷贝(比如重写clone()或通过构造函数复制属性),但这里的元素是Integer(不可变类型),所以直接复制集合即可。
内容的提问来源于stack exchange,提问作者Etienne Savary
相关产品推荐
相关产品推荐

