Java 9 的 Map.of() 是创建小型不可变 Map 的静态工厂方法,支持最多10个键值对,键值均不可为 null 且必须唯一,适用于配置、常量映射等场景。

Java 9 引入的 Map.of() 是创建小型不可变 Map 的最简洁方式,适合配置、常量映射、枚举替代等场景。它不是“抽象工厂方法”,而是静态工厂方法,返回的是 JVM 内置的轻量级不可变实现(如 ImmutableCollections.MapN),不支持 null 键或值,且大小上限为 10 个键值对(超过需用 Map.ofEntries())。
适用场景与核心限制
适合一次性定义固定映射关系,比如 HTTP 状态码描述、单位缩写、状态码转义名等。注意三点:
- 键和值都不能为
null,否则抛NullPointerException - 键必须唯一,重复会抛
IllegalArgumentException - 最多支持 10 个键值对;超过请改用
Map.ofEntries(Map.entry(k1,v1), ...)
基础用法:从零到一创建只读字典
直接传入成对的 key-value 参数即可:
Map<string integer> statusCodes = Map.of(
"OK", 200,
"NOT_FOUND", 404,
"SERVER_ERROR", 500
);</string>
该 Map 不可修改:
– 调用 put()、remove()、clear() 会抛 UnsupportedOperationException
– 迭代器也不支持 remove()
进阶技巧:嵌套结构与类型安全
可组合其他不可变集合增强表达力。例如构建「操作类型 → 默认超时(秒)→ 重试次数」三层映射:
Map<string map integer>> timeoutPolicy = Map.of(
"read", Map.of(30, 2, 60, 1),
"write", Map.of(15, 3)
);</string>
编译期即检查泛型一致性,运行时仍保持不可变性。若需更复杂逻辑(如动态计算默认值),建议封装为静态方法,内部用 Map.of() 初始化后返回。
避坑提醒:常见误用与替代方案
不要试图绕过限制:
- ❌
Map.of(null, "x")—— 抛 NPE - ❌
Map.of("a", 1, "a", 2)—— 抛 IAE - ❌
Map.of(k1,v1,k2,v2,...,k11,v11)—— 编译失败(参数超限)
遇到以上情况,请按需选择:
– 含 null:用 new HashMap(){{ put(k,v); }}(不推荐)或 Map.copyOf(HashMap)(Java 10+)
– 大于 10 对:用 Map.ofEntries(entry(k1,v1), ..., entry(kN,vN))
– 需排序:用 Map.copyOf(new TreeMap(...)) 或 TreeMap.copyOf(...)(Java 16+)










