Java 9 的 Map.of() 和 Map.ofEntries() 创建不可变 Map,不支持修改操作;前者限 10 对键值且键不能 null 或重复,后者通过 Entry 突破数量限制,二者均为轻量级专用实现,优于 Collections.unmodifiableMap()。

Java 9 引入了 Map.of() 和 Map.ofEntries() 静态工厂方法,用于简洁、安全地创建**不可变的(immutable)Map**。它们返回的 Map 不支持 put、remove、clear 等修改操作,尝试调用会抛出 UnsupportedOperationException。
Map.of():直接传入键值对参数
适用于键值对数量较少(最多 10 对)且键、值类型明确的场景。语法简洁,编译期检查强。
- 支持 0 到 10 个参数,按
key1, value1, key2, value2, ...顺序传入 - 键不能为
null;若值为null,运行时抛出NullPointerException - 键必须互不相同,重复键会导致
IllegalArgumentException
示例:
Map<String, Integer> map = Map.of("a", 1, "b", 2, "c", 3);// Map.of() 返回的 map 是不可变的
// map.put("d", 4); // ❌ 运行时报 UnsupportedOperationException
Map.ofEntries():通过 Map.Entry 组合构造
适合键值对较多、或需要动态组装 Entry 的情况(比如从已有数据结构转换)。可突破 of() 的 10 对限制。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 接收一个或多个
Map.Entry对象,常用Map.entry(key, value)辅助创建 - 同样要求键非 null、键不重复、值为 null 时抛 NPE
- Entry 数量无硬性上限(仅受内存和 JVM 参数限制)
示例:
Map<String, String> map = Map.ofEntries(Map.entry("name", "Alice"),
Map.entry("city", "Beijing"),
Map.entry("job", "Engineer")
);
注意事项与常见误区
这些工厂方法创建的是轻量级不可变实现(如 ImmutableCollections$MapN),不是 Collections.unmodifiableMap() 包装的可变底图。
- 不可变性是深度的:不提供任何修改入口,也不允许外部间接修改(因为不暴露内部结构)
- 空 Map 应用
Map.of()(零参数),而不是new HashMap<>()再包装 - 若需可变 Map,不要试图绕过不可变性——应改用
new HashMap<>()或Map.copyOf()复制后修改 - 注意泛型推断:当键或值类型存在继承关系时,显式声明泛型可避免意外的类型擦除问题
对比 Collections.unmodifiableMap()
Map.of() 和 unmodifiableMap() 都返回不可变视图,但本质不同:
-
Map.of()创建的是全新、紧凑、只读的专用实例,内存更省,性能略优 -
Collections.unmodifiableMap(new HashMap())只是给可变 Map 加了一层“只读壳”,底层仍可被其他引用修改 - 除非需要基于已有可变 Map 构建只读视图,否则优先选
Map.of*

















