javase-不可变集合

64 阅读2分钟

JDK9以后才有不可变集合


创建不可变集合的应用场景

  1. 如果某个数据不能被修改,可以把他拷贝到不可变集合。
  2. 当集合对象被不可信的库调用,不可变形式是安全的。

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

在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合 在这里插入图片描述

这个集合不能添加,不能删除,不能修改。

public class Demo01 {
    public static void main(String[] args) {
    	// 一旦创建完毕,是无法修改的,只能进行查询操作
    	List<String> list = List.of("张三", "李四");
    	// 在Set集合中,里边的参数要保证唯一,否则就会报错
    	Set<String> set = Set.of("张三", "李四");
    	// 在Map集合中,键也不能重复 且 参数有上限(最多只能传递10个键值对)
    	Map<String, Integer> map = Map.of("张三", 18, "李四", 19);
    }
}

由于Map.of()方法最多只能传递10个键值对,如果想存储超过10个的键值对,可以使用Map.ofEntries()方法

public class Demo02 {
    public static void main(String[] args) {
    	HashMap<String, Integer> map = new HashMap<>();
    	map.put("张三", 18);
    	// ...
    	// 获取所有的entry对象
    	Set<Map.Entry<String, Integer>> entries = map.entrySet();
    	// 把entries变成数组
    	// toArray底层会把集合的长度和数组的长度做一个比较
    	// 如果集合的长度 > 数组的长度,会根据实际数据的个数,重新创建新的数组
    	// 如果集合的长度 ≤ 数组的长度,表示数据在数组中放得下,不会创建新的数组,直接使用数组的长度
    	Map.Entry[] arr = entries.toArray(new Map.Entry[0]);
    	// 不可变的map集合
    	Map res = Map.ofEntries(arr);
    }
}

JDK10如果想存储超过10个的键值对,可以用Map.copyOf()方法

public class Demo03 {
    public static void main(String[] args) {
    	HashMap<String, Integer> map = new HashMap<>();
    	map.put("张三", 18);
    	// ...
    	Map res = Map.copyOf(map);
    }
}