java17创建map的方式有几种

 更新时间:2025年12月04日 10:52:27   作者: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);

🔒 特点:

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

相关文章

  • spring boot如何基于JWT实现单点登录详解

    spring boot如何基于JWT实现单点登录详解

    这篇文章主要介绍了spring boot如何基于JWT实现单点登录详解,用户只需登录一次就能够在这两个系统中进行操作。很明显这就是单点登录(Single Sign-On)达到的效果,需要的朋友可以参考下
    2019-06-06
  • java集合类ArrayList和Vector的区别面试精讲

    java集合类ArrayList和Vector的区别面试精讲

    这篇文章主要为大家介绍了java集合类ArrayList和Vector的区别面试全面讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java Elastic Job动态添加任务实现过程解析

    Java Elastic Job动态添加任务实现过程解析

    这篇文章主要介绍了Java Elastic Job动态添加任务实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 基于Springboot疫苗接种行程管理系统的设计与实现

    基于Springboot疫苗接种行程管理系统的设计与实现

    本文主要介绍了基于Springboot实现的疫苗接种行程管理系统的示例代码,系统主要实现个人疫苗接种管理、行程管理、病史管理、风险地区管理、核酸检测报告结果上报、疫情新闻管理等功能,需要的可以参考一下
    2022-03-03
  • JAVA hashCode使用方法详解

    JAVA hashCode使用方法详解

    本文详细解释了JAVA hashCode的使用方法,提供了测试hashCode和equals方法的使用实例
    2013-11-11
  • java生成饼图svg及JFreeChart生成svg图表

    java生成饼图svg及JFreeChart生成svg图表

    java生成饼图svg,代码实现感觉有点复杂,个人认为不如用JFreeChart,这篇文章主要介绍java生成饼图svg及JFreeChart生成svg图表,有需要的小伙伴可以参考下
    2015-08-08
  • Spring Boot 集成Elasticsearch模块实现简单查询功能

    Spring Boot 集成Elasticsearch模块实现简单查询功能

    本文讲解了Spring Boot集成Elasticsearch采用的是ES模板的方式实现基础查询,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-06-06
  • Spring ApplicationListener的使用详解

    Spring ApplicationListener的使用详解

    这篇文章主要介绍了Spring ApplicationListener的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • SpringBoot使用ShardingSphere-Proxy的实现示例

    SpringBoot使用ShardingSphere-Proxy的实现示例

    ShardingSphere-Proxy是一个独立的数据库代理层,可以与SpringBoot集成,本文介绍了SpringBoot使用ShardingSphere-Proxy的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Spring中任务调度之解读@Scheduled和@Schedules注解的使用

    Spring中任务调度之解读@Scheduled和@Schedules注解的使用

    这篇文章主要介绍了Spring中任务调度之解读@Scheduled和@Schedules注解的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论