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

相关文章

  • 打包SpringBoot程序为exe的案例教程

    打包SpringBoot程序为exe的案例教程

    这篇文章主要介绍了打包SpringBoot程序为exe的案例教程,文中通过图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • Java png图片修改像素rgba值的操作

    Java png图片修改像素rgba值的操作

    这篇文章主要介绍了Java png图片修改像素rgba值的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java中Vector、ArrayList、LinkedList的关系详细解析

    Java中Vector、ArrayList、LinkedList的关系详细解析

    这篇文章主要介绍了Java中Vector、ArrayList、LinkedList的关系详细解析,Vector和ArrayList底层均为Object数组,LinkedList底层是Node节点,Vector是线程安全(底层方法均添加synchronized),ArrayList、LinkedList是线程不安全(无锁),需要的朋友可以参考下
    2023-11-11
  • Java中图片的常用操作代码总结

    Java中图片的常用操作代码总结

    这篇文章主要为大家详细介绍了Java中对图片进行常用操作处理的代码,例如生成自定义图片、获取图片格式、图片的裁剪与压缩等,感兴趣的小伙伴可以了解一下
    2022-11-11
  • java实现留言板功能实例

    java实现留言板功能实例

    这篇文章主要为大家详细介绍了JSP+JavaBean的留言板技术 ,JavaWeb登陆功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java中类加载过程全面解析

    Java中类加载过程全面解析

    这篇文章主要介绍了Java中类加载过程全面解析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java中jstat命令的使用详解

    Java中jstat命令的使用详解

    jstat命令可以查看堆内存各部分的使用量,以及加载类的数量,下面这篇文章主要给大家介绍了关于Java中jstat命令使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • java并发编程之ThreadLocal详解

    java并发编程之ThreadLocal详解

    在锁的使用中会导致运行效率降低,ThreadLocal的使用彻底避免对共享资源的竞争,同时又可以不影响效率。本文详细讲解了ThreadLocal,需要了解的小伙伴可以看一看这篇文章
    2021-08-08
  • Java高级之虚拟机加载机制的实例讲解

    Java高级之虚拟机加载机制的实例讲解

    下面小编就为大家分享一篇Java高级之虚拟机加载机制的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Mybatis报错mapkey is required问题及解决

    Mybatis报错mapkey is required问题及解决

    这篇文章主要介绍了Mybatis报错mapkey is required问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论