java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > java17创建map

java17创建map的方式有几种

作者:Such丶安好

Java17提供了多种创建Map的方式,主要分为可变和不可变Map两种类型,本文就来介绍一下java17创建map的方式有几种,感兴趣的可以了解一下

在 Java 17中,创建 Map的方式有多种,主要取决于你使用的是 不可变 Map(Immutable Map)、可变 Map(Mutable Map),以及你希望使用 传统方式、Java 9+ 引入的工厂方法,还是 Stream / Collectors 工具类构建等。

下面我将为你全面梳理 Java 17 中创建 Map 的常见方式,并分类说明,包括 可变与不可变、传统与现代写法。

✅ 一、创建可变 Map(Mutable Map)(可增删改)

指的是创建后可以 继续修改(put、remove 等操作)的 Map,通常是 HashMapLinkedHashMapTreeMap等。

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);

🔒 特点:

✅ 二、创建不可变 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);

⚠️ 限制:

(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)
    // ...理论上可以很多,但建议适度
);

🔒 特点:

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);

🔒 特点:

✅ 三、其他创建 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}

🔒 特点:

✅ 四、总结:Java 17 创建 Map 的常见方式(表格概览)

方式

可变性

是否支持 Null

键值对数量限制

适用场景

Java 版本

new HashMap<>()
new LinkedHashMap<>()
new TreeMap<>()

✅ 可变

✅ 支持 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文