在 java 17中,创建 map的方式有多种,主要取决于你使用的是 不可变 map(immutable map)、可变 map(mutable map),以及你希望使用 传统方式、java 9+ 引入的工厂方法,还是 stream / collectors 工具类构建等。
下面我将为你全面梳理 java 17 中创建 map 的常见方式,并分类说明,包括 可变与不可变、传统与现代写法。
✅ 一、创建可变 map(mutable map)(可增删改)
指的是创建后可以 继续修改(put、remove 等操作)的 map,通常是 hashmap、linkedhashmap、treemap等。
1.最传统、最常用的方式:使用new hashmap<>()等
// 创建一个可变的 hashmap
map<string, integer> map1 = new hashmap<>();
map1.put("apple", 1);
map1.put("banana", 2);
// linkedhashmap(保持插入顺序)
map<string, integer> map2 = new linkedhashmap<>();
map2.put("one", 1);
map2.put("two", 2);
// treemap(按键排序)
map<string, integer> map3 = new treemap<>();
map3.put("z", 26);
map3.put("a", 1);🔒 特点:
- 可变(mutable):支持增删改查;
- 最基础、最灵活,适用于绝大多数需要修改的场景;
- 没有语法糖,需要手动
put。
✅ 二、创建不可变 map(immutable map)(创建后不能修改)
指的是创建后 不能增删改,适合配置、常量、映射关系固定等场景。
1.java 9+ 推荐:使用map.of()和map.ofentries()(简洁、不可变)
✅ java 9 引入,java 17 完全支持!
(1)map.of(k k1, v v1, k k2, v v2, ...)——适合少量键值对(最多10组)
// java 9+ 提供的不可变 map,最多支持 10 组键值对
map<string, integer> immutablemap1 = map.of(
"apple", 1,
"banana", 2,
"cherry", 3
);
// 以下会编译报错:map.of() 最多允许 10 个键值对
// map<string, integer> map = map.of("a",1,"b",2,... up to 10);⚠️ 限制:
- 键值对数量 不能超过 10 组;
- 键和值都不可为 null(会抛
nullpointerexception); - 创建后 完全不可变(不能 put、remove、clear 等)。
(2)map.ofentries(map.entry<?, ?>...)或使用map.entry(k, v)构造更多键值对
当你想创建 超过 10 组键值对,或者更灵活地构造 entry 时,可以用:
import java.util.map;
map<string, integer> immutablemap2 = map.ofentries(
map.entry("apple", 1),
map.entry("banana", 2),
map.entry("cherry", 3),
map.entry("date", 4),
// 可以继续添加,没有 10 个的限制
map.entry("elderberry", 5)
// ...理论上可以很多,但建议适度
);🔒 特点:
- 键值对数量 无硬性限制(但别太夸张);
- 同样 不可变(immutable),创建后不能修改;
- 键和值 不允许为 null(会抛异常);
- 更灵活,适合较复杂的初始化。
2.使用collections.unmodifiablemap()包装一个普通 map(手动构造后再设为不可变)
适用于:你先创建一个普通的 hashmap,然后希望包装成 不可修改的视图。
map<string, integer> mutablemap = new hashmap<>();
mutablemap.put("apple", 1);
mutablemap.put("banana", 2);
// 包装为不可修改的 map(视图)
map<string, integer> unmodifiablemap = collections.unmodifiablemap(mutablemap);
// 以下操作会抛 unsupportedoperationexception:
// unmodifiablemap.put("cherry", 3);🔒 特点:
- 原始
mutablemap仍然可变(如果你保留了它的引用); - 但
unmodifiablemap是一个 只读视图,任何修改操作都会抛异常; - 适用于“构造后转不可变”的场景。
✅ 三、其他创建 map 的方式(java 17 也支持)
1.双括号初始化(double brace initialization)——不推荐 ✖️
这是一种利用匿名内部类的写法,可以快速初始化 map,但:
- 不推荐使用!
- 会导致内存泄漏(内部类持有外部类引用);
- 代码可读性差;
- 性能与设计上均有问题;
// 不推荐!!!仅作了解
map<string, integer> map = new hashmap<>() {{
put("apple", 1);
put("banana", 2);
}};❗ java 社区普遍不推荐此写法,尤其在正式项目中。
2.使用 stream + collectors.tomap()(适合动态构建、转换等场景)
适用于:你有一组数据,想通过 流(stream)处理后收集为 map。
import java.util.*;
import java.util.stream.*;
list<string> fruits = arrays.aslist("apple", "banana", "cherry");
// 比如:将 list 转为 map<元素, 长度>
map<string, integer> map = fruits.stream()
.collect(collectors.tomap(
fruit -> fruit, // key: 水果名称
fruit -> fruit.length() // value: 名称长度
));
// 结果如:{"apple"=5, "banana"=6, "cherry"=6}🔒 特点:
- 非常灵活,适合 动态构建 map;
- 你可以控制 key / value 的生成逻辑;
- 如果 key 重复,需处理冲突(或使用
collectors.tomap(key, value, (v1,v2)->v1)合并函数); - 返回的是 可变 map(通常是 hashmap)。
✅ 四、总结:java 17 创建 map 的常见方式(表格概览)
方式 | 可变性 | 是否支持 null | 键值对数量限制 | 适用场景 | java 版本 |
|---|---|---|---|---|---|
new hashmap<>() | ✅ 可变 | ✅ 支持 null | 无限制 | 通用可变 map,最常用 | 所有版本 |
map.of(k1,v1, ...) | ❌ 不可变 | ❌ 不支持 null | 最多 10 组 | 少量固定键值对,常量初始化 | java 9+ |
map.ofentries(map.entry(k,v)...) | ❌ 不可变 | ❌ 不支持 null | 无严格限制 | 较多键值对、灵活初始化 | java 9+ |
collections.unmodifiablemap(map) | ❌ 不可变(视图) | ✅ 取决于原 map | 无限制 | 将已有 map 转为不可变视图 | 所有版本 |
stream + collectors.tomap() | ✅ 可变(通常是 hashmap) | ✅ 取决于逻辑 | 无限制 | 动态构建、转换数据为 map | 所有版本 |
双括号初始化 {{ put(...) }} | ✅ 可变 | ✅ 支持 null | 无限制 | 快速测试,不推荐生产使用 | 所有版本(但不推荐) |
✅ 推荐实践(java 17)
场景 | 推荐方式 |
|---|---|
需要可变 map,后续增删改查 | map<string, integer> map = new hashmap<>(); |
少量固定键值对(<=10),不可变(常量) | map.of("k1", v1, "k2", v2) |
多个键值对(>10)、不可变 | map.ofentries(map.entry(k1,v1), map.entry(k2,v2), ...) |
动态构建 map(如从 list 转 map) | list.stream().collect(collectors.tomap(...)) |
将现有 map 设为不可变 | collections.unmodifiablemap(map) |
不推荐 | 双括号初始化 {{ put(...) }} |
✅ 示例:java 17 创建 map 的推荐写法
1. 可变 map(最常用):
map<string, integer> map = new hashmap<>();
map.put("apple", 1);2. 不可变 map(少量):
map<string, integer> immutablemap = map.of("a", 1, "b", 2);3. 不可变 map(较多键值对):
map<string, integer> immutablemap = map.ofentries(
map.entry("a", 1),
map.entry("b", 2),
map.entry("c", 3)
);4. 动态构建(比如从对象列表生成):
list<string> names = list.of("alice", "bob", "charlie");
map<string, integer> namelengths = names.stream()
.collect(collectors.tomap(name -> name, string::length));✅ 总结回答(一句话)
在 java 17 中,创建 map 的方式有很多种,常见的包括:使用 new hashmap<>()(可变,最常用)、map.of()和 map.ofentries()(java 9+,不可变,简洁)、collections.unmodifiablemap()(包装为不可变视图)、以及 stream + collectors.tomap()(动态构建)。你可以根据是否需要可变性、是否要不可变、键值对数量、代码风格等选择最合适的方式。
到此这篇关于java17创建map的方式有几种的文章就介绍到这了,更多相关java17创建map内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论