不可变集合

该笔记基于b站视频完成Java-Stream流从入门到精通

什么是不可变集合?

不可变集合就是不能修改的集合

应用场景:

  • 如果某个数据不能被修改,把它防御性的拷贝到不可变集合中是一个很好的实践
  • 当集合对象被不可信的库调用的时候,不可变形式是安全的

简单理解就是不想让别人修改集合中的内容
例如扑克牌,集合中存储扑克牌的种类和数量是不可变的


创建不可变集合的书写格式

方法名称 说明
static List of (E…elements) 创建一个具有指定元素的List集合对象
static Set of (E…elements) 创建一个具有指定元素的Set集合对象
static <E,V> Map<E,V> of (E…elements) 创建一个具有指定元素的Map集合对象

创建不可变List集合

1
2
// 一旦创建完成之后,是无法进行修改的,在下面的代码中,只能进行查询操作
List<String> list = List.of("张三","李四","王五","赵六"); // 该方法在jdk1.9及以后才有

创建不可变Set集合

1
2
3
// 一旦创建完成之后,是无法进行修改的,在下面的代码中,只能进行查询操作
// Map中的元素不能重复
Set<String> set = Set.of("张三","李四","王五","赵六"); // 该方法在jdk1.9及以后才有

创建不可变Map集合

1
2
3
4
5
6
7
// 一旦创建完成之后,是无法进行修改的,在下面的代码中,只能进行查询操作
/**
Map中的键位不能重复
Map里面的of方法,参数是有上限的,最多只能传递20个参数,也就是10对键值对,因为形参列表中只能有一个可变参数
如果我们要创建多个键值对对象,数量大于10个,在Map接口中还有一个方法ofEntries,把键和值看做一个整体来作为可变形参
*/
Map.of("张三","北京","李四","上海"); // 张三是key,北京是value;李四是key,上海是value

Map的ofEntries

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 创建Map的不可变集合,键值对数量超过10
// 1.创建一个普通的Map集合
HashMap<String, String> map = new HashMap<>();
map.put("1","a");
map.put("2","b");
map.put("3","c");
map.put("4","d");
map.put("5","e");
map.put("6","f");
map.put("7","g");
map.put("8","h");
map.put("9","i");
map.put("10","j");
map.put("11","k");

// 2.利用上面的数据来获取一个不可变集合


/**

方法一

// 获取到所有的键值对对象(Entry对象)
Set<Map.Entry<String, String>> entries = map.entrySet();
// 把entries变成一个数组
Map.Entry[] arr1 = new Map.Entry(0);
// toArray方法在底层会比较集合的长度和数组长度两者的大小
// 如果集合的长度 > 数组的长度 : 数据在集合中放不下,此时会根据实际数据个数,查询创建数组
Map.Entry[] arr2 = entries.toArray(arr1);

// 不可变的Map集合
Map map = Map.ofEntries(arr2);
*/

// 方法二
//Map<Object, Object> map = Map.ofEntries(map.entrySet().toArray(new Map.Entry[0]));

// 方法上:jdk 10 才开始有
Map<String, String> map = Map.copyOf(map);


总结

  1. 不可变集合的特点

    定义完成后不可以修改,或者添加、删除

  2. 创建不可变集合

    List、Set、Map接口中,都存在of方法可以创建不可变集合

  3. 三种方式的细节

    • List:直接用
    • Set:元素不能重复
    • Map:元素不能重复,键值对数量最多是10个,超过10个用ofEntries方法

不可变集合
https://lzhengjy.github.io/2023/10/22/不可变集合/
作者
Zheng
发布于
2023年10月22日
许可协议