不可变集合
不可变集合就如其名,是不可以被修改的集合,无法修改其内容,也无法修改其长度
应用场景:
- 用于存储一些不能被修改的数据
- 不想让别人修改集合中的内容时
不可变集合的分类:
- 不可变的list集合
- 不可变的set集合
- 不可变的map集合
不可变的list集合
使用List.of()方法创建不可变的list集合
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Demo {
public static void main(String[] args) {
List<String> list = List.of("张三", "李四", "王五");
for (String name : list) {
System.out.println(name);
}
// 下方3行代码会报错
// list.add("赵六");
// list.remove("张三");
// list.set(0, "赵六");
}
}
|
不可变的Set集合
使用Set.of()方法创建不可变的Set集合
代码演示:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Demo02 {
public static void main(String[] args) {
Set<String> set = Set.of("张三", "李四", "王五");
for (String name : set) {
System.out.println(name);
}
// 下面2行代码会报错
// set.remove("张三");
// set.add("赵六");
}
}
|
不可变的Map集合
使用Map.of()方法创建不可变的Map集合
Map里面的of方法,参数是有上限的,最多只能传递20个参数,即10个键值对
键值对个数小于等于10时
直接使用Map.of()方法创建
代码示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class Demo03 {
public static void main(String[] args) {
Map<String, Integer> map = Map.of("张三", 18, "王五", 20, "赵六", 19);
Set<String> keys = map.keySet();
for (String key : keys) {
Integer value = map.get(key);
System.out.println(key + ":" + value);
}
// 下面的代码会报错
// map.put("李四", 19);
// map.remove("张三");
}
}
|
键值对个数大于10时
先创建一个普通的Map集合,然后再使用Map.copyOf()方法
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
|
public class Demo04 {
public static void main(String[] args) {
// 先创建一个普通的Map集合
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("张三", 1);
hashMap.put("李四", 2);
hashMap.put("王五", 3);
hashMap.put("赵六", 4);
hashMap.put("孙七", 5);
hashMap.put("周八", 6);
hashMap.put("吴九", 7);
hashMap.put("郑十", 8);
hashMap.put("十一", 9);
hashMap.put("十二", 10);
hashMap.put("十三", 11);
// 使用copyOf()方法将普通Map转换为不可变Map(底层使用的是ofEntries()方法)
Map<String, Integer> map = Map.copyOf(hashMap);
/*
// ofEntries()方法
// 获取到所有的键值对对象(Entry对象)
Set<Map.Entry<String, Integer>> entries = hashMap.entrySet();
// 把entries变成一个数组,new Map.Entry[0]用来指定返回数组的类型
// toArray方法在底层会比较集合的长度跟数组的长度两者的大小
// 如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
// 如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
// 所以new Map.Entry[]时,初始值写0即可
Map.Entry[] arr = entries.toArray(new Map.Entry[0]);
// 获取不可变的map集合
Map map = Map.ofEntries(arr);
*/
}
}
|