为何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
相关产品推荐
相关产品推荐

