不可变集合

简单介绍了Java中的三种不可变集合

不可变集合

不可变集合就如其名,是不可以被修改的集合,无法修改其内容,也无法修改其长度

应用场景

  • 用于存储一些不能被修改的数据
  • 不想让别人修改集合中的内容时

不可变集合的分类

  • 不可变的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);

        */
    }
}
本站于2025年3月26日建立
使用 Hugo 构建
主题 StackJimmy 设计