Java中如何通过Collections.singletonMap()构造只含一对键值的不可变Map?

2026-04-29 09:072阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1239个文字,预计阅读时间需要5分钟。

Java中如何通过Collections.singletonMap()构造只含一对键值的不可变Map?

伪原创

该对象返回的是一种不可变的视图,底层没有存储结构。所有的修改操作(如 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,但行为和限制不同。两者不是简单替代关系。

阅读全文
标签:Java

本文共计1239个文字,预计阅读时间需要5分钟。

Java中如何通过Collections.singletonMap()构造只含一对键值的不可变Map?

伪原创

该对象返回的是一种不可变的视图,底层没有存储结构。所有的修改操作(如 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,但行为和限制不同。两者不是简单替代关系。

阅读全文
标签:Java