Java中 创建不可变集合

常规写法

以往我们创建一些不可变集合的时候,通常是这样写的:

// 不可变的Set

Set<String> set = new HashSet<>();

set.add("a");

set.add("b");

set.add("c");

set = Collections.unmodifiableSet(set);

// 不可变的List

List<Integer> list = new ArrayList<>();

list.add(1);

list.add(2);

list.add(3);

list = Collections.unmodifiableList(list);

Java8的写法

在Java 8的时候,利用Stream API还能简化一下,可以演变成这样:

Set<String> set = Collections.unmodifiableSet(Stream.of("a", "b", "c").collect(toSet()));

List<Integer> list = Collections.unmodifiableList(Stream.of(1, 2, 3).collect(toList()));

Java9的写法

而现在到了Java 9,这一操作变的更为简单,只需要这样:

Set<String> set = Set.of("a", "b", "c");
List<Integer> list = List.of(1, 2, 3);

同时,对于一下更复杂的集合也一样支持,比如Map类型也可以这样写:

Map<String, String> map = Map.of("a", "1", "b", "2", "c", "3");

就是要注意下,Map.of的参数是key和value成对出现的,所以参数数量一定是偶数:

Map.of()

Map.of(k1, v1)

Map.of(k1, v1, k2, v2)

Map.of(k1, v1, k2, v2, k3, v3)

...

与asList的区别

看到这里,可能有的人会问了,之前不是对于集合有asXxx这样的方便方法了么?他们有啥区别吗?

这里就以 List.of 和 Arrays.asList 为例,给大家列一下它们的异同:

Java 9中推出 List.of 创建的是不可变集合,而 Arrays.asList 是可变集合

List.of 和 Arrays.asList 都不允许add和remove元素,但 Arrays.asList 可以调用set更改值,而 List.of 不可以,会报 java.lang.UnsupportedOperationException 异常

List.of 中不允许有null值, Arrays.asList 中可以有null值

相关推荐
Roadinforest5 分钟前
Spring Boot 4 六步入门实录:从 Hello World 到一个能交付的 Todo API
java·开发语言·spring boot·spring
半仙白桑6 分钟前
内核篇第十三讲:system-V消息队列
java·linux·网络
今天的砖头有点烫手啊11 分钟前
GC 算法与垃圾收集器演进:从 Serial 到 ZGC
java·jvm
alphaTao12 分钟前
LeetCode 每日一题 2026/9/21-2026/9/27
python·算法·leetcode
牧瀬クリスだ25 分钟前
Mybatis-Plus:让CRUD快如闪电
java·spring boot·spring·tomcat·mybatis·yml
盐焗鹌鹑蛋32 分钟前
【Linux】线程概念和控制
java·linux·服务器
计算机源码社42 分钟前
【27届大数据毕设】基于Spark的AI艺术创作者价值评估与市场趋势预测研究 基于Python与Spark的AI生成艺术受众画像及异常热度识别可视化平台
大数据·人工智能·hadoop·python·spark·毕业设计·课程设计
CarIise44 分钟前
MyBatis缓存与分页插件:从一级二级缓存到底层原理与PageHelper实战
java·开发语言·spring
huisheng_qaq3 小时前
【Python基础篇-04】深入理解python的函数、参数与作用域
python·ai·函数·参数作用域
宸津-代码粉碎机7 小时前
OpenAI 连夜迎战 Grok Bot 和 Muse:AI 智能体从 “会聊天” 到 “能办事”,现在入场还来得及吗
java·大数据·人工智能·分布式·python