You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 07:37:21