Java中如何通过Collections.singletonMap()构造只含一对键值的不可变Map?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1239个文字,预计阅读时间需要5分钟。
伪原创
该对象返回的是一种不可变的视图,底层没有存储结构。所有的修改操作(如 put()、remove()、clear() 等)都会直接抛出 UnsupportedOperationException 异常。这并非懒加载错误,而是设计上就禁止使用了写操作——例如 singletonMap 的内部实现类重写了所有 mutator 方法,并统一抛出异常。
常见误用场景:拿到返回值后尝试 map.put("newKey", "newValue"),结果运行时崩在这一行,且 IDE 不会提前警告。
- 它不继承自
AbstractMap,而是一个独立私有静态类,连entrySet()返回的也是只读集合 - 键和值在构造时就被强引用捕获,后续无法被 GC(除非整个 map 被丢弃)
- 线程安全:由于不可变,天然线程安全,但注意——如果键或值对象本身可变(如传入一个
ArrayList),那外部仍可修改其内容
Collections.singletonMap() 和 Map.of() 在 Java 9+ 的关键区别
Java 9 引入了 Map.of(),它也返回不可变 Map,但行为和限制不同。两者不是简单替代关系。
本文共计1239个文字,预计阅读时间需要5分钟。
伪原创
该对象返回的是一种不可变的视图,底层没有存储结构。所有的修改操作(如 put()、remove()、clear() 等)都会直接抛出 UnsupportedOperationException 异常。这并非懒加载错误,而是设计上就禁止使用了写操作——例如 singletonMap 的内部实现类重写了所有 mutator 方法,并统一抛出异常。
常见误用场景:拿到返回值后尝试 map.put("newKey", "newValue"),结果运行时崩在这一行,且 IDE 不会提前警告。
- 它不继承自
AbstractMap,而是一个独立私有静态类,连entrySet()返回的也是只读集合 - 键和值在构造时就被强引用捕获,后续无法被 GC(除非整个 map 被丢弃)
- 线程安全:由于不可变,天然线程安全,但注意——如果键或值对象本身可变(如传入一个
ArrayList),那外部仍可修改其内容
Collections.singletonMap() 和 Map.of() 在 Java 9+ 的关键区别
Java 9 引入了 Map.of(),它也返回不可变 Map,但行为和限制不同。两者不是简单替代关系。

