Java 不可变集合详解:List、Set 与 Map 的正确使用
1. 什么是不可变集合
在 Java 开发中,不可变集合(Immutable Collection)是指长度固定且内容无法修改的集合对象。一旦创建完成,任何尝试添加、删除或修改元素的操作都会抛出 UnsupportedOperationException 异常。
1.1 核心特性
- 长度不可变:创建后容量固定,不能扩容或缩容。
- 内容不可变:元素引用不可更改,通常用于存储常量或配置信息。
- 线程安全:由于状态不可变,多线程环境下无需同步锁即可安全共享。
1.2 使用场景
将数据防御性地拷贝到不可变集合中是一种良好的编程实践,特别是在以下场景中:
- 数据保护:当集合对象被不可信的库调用时,不可变形式可以防止外部代码意外修改内部状态。
- 配置管理:系统启动时的配置参数通常不应在运行时被修改。
- 性能优化:不可变对象可以作为 Hash 表的键(Key),因为其哈希值稳定。
- API 设计:返回不可变集合可以确保调用者无法破坏封装性。
简单理解:不想让别人修改集合中的内容,或者希望保证数据的一致性。
例如:
- 斗地主的 54 张牌,是不能添加、不能删除、不能修改的。
- 斗地主的打牌规则(单张、对子、三张等),也是不能修改的。
- 用代码获取的操作系统硬件信息,也是不能被修改的。
2. 不可变集合分类
Java 提供了多种创建不可变集合的方式,主要分为三类:
- 不可变的 List 集合:通过
List.of()或Collections.unmodifiableList()实现。 - 不可变的 Set 集合:通过
Set.of()实现。 - 不可变的 Map 集合:通过
Map.of()、Map.ofEntries()或Map.copyOf()实现。
3. 不可变的 List 集合
从 Java 9 开始,List 接口提供了静态工厂方法 of(),可以直接创建不可变列表。
3.1 基本用法
import java.util.List;
import java.util.Iterator;
public class ImmutableListDemo {
public static void main(String[] args) {
/*
* 创建不可变的 List 集合
* 元素:"张三", "李四", "王五", "赵六"
*/
List<String> list = List.of(, , , );
System.out.println(list.get());
System.out.println(list.get());
System.out.println(list.get());
System.out.println(list.get());
System.out.println();
(String s : list) {
System.out.println(s);
}
System.out.println();
Iterator<String> it = list.iterator();
(it.hasNext()){
it.next();
System.out.println(s);
}
System.out.println();
( ; i < list.size(); i++) {
list.get(i);
System.out.println(s);
}
System.out.println();
{
list.set(, );
} (UnsupportedOperationException e) {
System.out.println( + e.getMessage());
}
}
}


