【从零开始学Java | 第三十篇】不可变集合
目录前言一、什么是不可变集合二、不可变集合使用方式1.List不可变集合2.Set不可变集合3.Map不可变集合前言在日常的 Java 开发中我们经常遇到这样的场景你写了一个方法返回一个包含了系统核心配置参数的普通的ArrayList其他调用者就可以随意地调用.add()或.remove()方法悄悄篡改你的核心数据。不可变集合Immutable Collections就可以解决这个问题。一、什么是不可变集合不可变集合就是一旦被创建它的内容元素数量、具体元素就绝对不能再被修改的集合。 你不能向里面添加新元素不能删除老元素也不能替换现有的元素。应用场景绝对的线程安全因为数据不能被修改所以多个线程同时读取它时永远不需要加锁没有任何并发冲突。防御性编程将不可变集合作为返回值传递给第三方模块可以保证你的底层数据不会被恶意或无意地篡改。更高的内存效率不可变集合在底层不需要像ArrayList那样预留冗余空间来应对未来的扩容它的内存占用更加紧凑。二、不可变集合使用方式方法名说明staitc E ListE of(E...elements)创建一个不可变List集合对象staitc E SetE of(E...elements)创建一个不可变Set集合对象staitc K, V MapK, V of(E...elements)创建一个不可变Map集合对象1.List不可变集合public class Test { public static void main(String[] args) { ListString l List.of(张三, 李四, 王五); System.out.println(l); l.remove(张三);//报错UnsupportedOperationException } }2.Set不可变集合与List创建有异曲同工之妙。public class Test { public static void main(String[] args) { SetString l Set.of(张三, 李四, 王五); System.out.println(l); l.remove(张三);//报错UnsupportedOperationException } }细节Set集合中不能有重复的元素当我创建有重复元素的Set集合对象时public class Test { public static void main(String[] args) { SetString s Set.of(张三, 李四, 王五, 张三); System.out.println(s); } }3.Map不可变集合细节1Map和Set一样不能创建有重复元素的集合对象。细节2使用Map.of()创建Map集合对象时最多存放10个键值对对象。正确使用方法①Map.ofEntries()如何理解这段代码呢首先我们知道可变参数在底层其实就是数组而Map.ofEntries()其中要传的参数是Entry类型核心思想就是把Map类型的对象转换为Set再转换为Entry类型的数组。public class Test { public static void main(String[] args) { HashMapString, String hm new HashMap(); hm.put(001, 张三); hm.put(002, 李四); hm.put(003, 王五); SetMap.EntryString, String entries hm.entrySet(); Map.Entry[] array entries.toArray(new Map.Entry[0]); MapString, String m Map.ofEntries(array); } }正确使用方法②上面的太晦涩难懂了因此在Java 10提出了copyOf()方法替代了上面的老旧方法。public class Test { public static void main(String[] args) { HashMapString, String hm new HashMap(); hm.put(001, 张三); hm.put(002, 李四); hm.put(003, 王五); // SetMap.EntryString, String entries hm.entrySet(); // // Map.Entry[] array entries.toArray(new Map.Entry[0]); // MapString, String m Map.ofEntries(array); // MapString, String m Map.copyOf(hm); } }