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

为何HashMap无法添加到Collections.singletonMap?运行报错解析

为什么Collections.singletonMap调用putAll会抛出UnsupportedOperationException?

核心原因

Collections.singletonMap返回的是一个不可变的单键值对Map实现,它从设计之初就不支持任何修改操作,包括put、putAll、remove等。

具体原理拆解

  • singletonMap的定位:它是Java集合框架提供的轻量级不可变容器,专门用来存储固定的单个键值对,相比HashMap这类可变集合,它的内存占用更小,不需要维护扩容、哈希冲突等逻辑,所以根本没有实现修改数据的代码。
  • Map接口的默认实现陷阱:Map接口定义了修改类方法,但并非所有实现类都必须支持。singletonMap继承自AbstractMap,而AbstractMap中的put、putAll等修改方法的默认实现就是直接抛出UnsupportedOperationException——因为它知道这类不可变子类不会去重写这些方法。
  • 你的代码触发逻辑:当你调用toEmails.putAll(userEmails)时,方法内部会循环调用put方法添加元素,而singletonMap没有重写put,所以直接执行AbstractMap的默认抛出异常逻辑。

解决办法

如果需要对这个Map进行修改操作,先把singletonMap的内容复制到可变的Map实现中(比如HashMap),再执行添加:

import java.util.*;

public class Hash_Map_Demo {
    public static void main(String[] args) {
        Map<String, String> userEmails = new HashMap<>();
        userEmails.put("abc@gmail.com", "abc");

        // 先将单键值对复制到可变HashMap中
        Map<String, String> toEmails = new HashMap<>(Collections.singletonMap("key", "Value"));
        toEmails.putAll(userEmails);
    }
}

内容的提问来源于stack exchange,提问作者Srigadha Raj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:25:03