JDK9以后才有不可变集合


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

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

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

在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合
d6832a15c2d74a54a1dd59ce05bb85f1.png

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

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);
}
}