• 不可变集合的详细概述


    1.不可变集合

    1.1 什么是不可变集合

    是一个长度不可变,内容也无法修改的集合

    1.2 使用场景

    如果某个数据不能被修改,把它防御性地拷贝到不可变集合中是个很好的实践。

    集合对象被不可信的库调用时,不可变形式是安全的。

    简单理解:

    不想让别人修改集合中的内容

    比如说:

    1,斗地主的54张牌,是不能添加,不能删除,不能修改的

    2,斗地主的打牌规则:单张,对子,三张,顺子等,也是不能修改的

    3,用代码获取的操作系统硬件信息,也是不能被修改的

    1.3 不可变集合分类

    • 不可变的list集合

    • 不可变的set集合

    • 不可变的map集合

    1.4 不可变的list集合

    1. public class ImmutableDemo1 {
    2.    public static void main(String[] args) {
    3.        /*
    4.            创建不可变的List集合
    5.            "张三", "李四", "王五", "赵六"
    6.        */
    7.        //一旦创建完毕之后,是无法进行修改的,在下面的代码中,只能进行查询操作
    8.        List list = List.of("张三", "李四", "王五", "赵六");
    9.        System.out.println(list.get(0));
    10.        System.out.println(list.get(1));
    11.        System.out.println(list.get(2));
    12.        System.out.println(list.get(3));
    13.        System.out.println("---------------------------");
    14.        for (String s : list) {
    15.            System.out.println(s);
    16.       }
    17.        System.out.println("---------------------------");
    18.        Iterator it = list.iterator();
    19.        while(it.hasNext()){
    20.            String s = it.next();
    21.            System.out.println(s);
    22.       }
    23.        System.out.println("---------------------------");
    24.        for (int i = 0; i < list.size(); i++) {
    25.            String s = list.get(i);
    26.            System.out.println(s);
    27.       }
    28.        System.out.println("---------------------------");
    29.        //list.remove("李四");
    30.        //list.add("aaa");
    31.        list.set(0,"aaa");
    32.   }
    33. }

    1.5 不可变的Set集合

    1. public class ImmutableDemo2 {
    2.    public static void main(String[] args) {
    3.        /*
    4.           创建不可变的Set集合
    5.           "张三", "李四", "王五", "赵六"
    6.           细节:
    7.                当我们要获取一个不可变的Set集合时,里面的参数一定要保证唯一性
    8.        */
    9.        //一旦创建完毕之后,是无法进行修改的,在下面的代码中,只能进行查询操作
    10.        Set set = Set.of("张三", "张三", "李四", "王五", "赵六");
    11.        for (String s : set) {
    12.            System.out.println(s);
    13.       }
    14.        System.out.println("-----------------------");
    15.        Iterator it = set.iterator();
    16.        while(it.hasNext()){
    17.            String s = it.next();
    18.            System.out.println(s);
    19.       }
    20.        System.out.println("-----------------------");
    21.        //set.remove("王五");
    22.   }
    23. }

    1.6 不可变的Map集合

    1.6.1:键值对个数小于等于10
    1. public class ImmutableDemo3 {
    2.    public static void main(String[] args) {
    3.       /*
    4.        创建Map的不可变集合
    5.            细节1:
    6.                键是不能重复的
    7.            细节2:
    8.                Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对
    9.            细节3:
    10.                如果我们要传递多个键值对对象,数量大于10个,在Map接口中还有一个方法
    11.        */
    12.        //一旦创建完毕之后,是无法进行修改的,在下面的代码中,只能进行查询操作
    13.        Map map = Map.of("张三", "南京", "张三", "北京", "王五", "上海",
    14.                "赵六", "广州", "孙七", "深圳", "周八", "杭州",
    15.                "吴九", "宁波", "郑十", "苏州", "刘一", "无锡",
    16.                "陈二", "嘉兴");
    17.        Set keys = map.keySet();
    18.        for (String key : keys) {
    19.            String value = map.get(key);
    20.            System.out.println(key + "=" + value);
    21.       }
    22.        System.out.println("--------------------------");
    23.        Set> entries = map.entrySet();
    24.        for (Map.Entry entry : entries) {
    25.            String key = entry.getKey();
    26.            String value = entry.getValue();
    27.            System.out.println(key + "=" + value);
    28.       }
    29.        System.out.println("--------------------------");
    30.   }
    31. }
    1.6.2:键值对个数大于10
    1. public class ImmutableDemo4 {
    2.    public static void main(String[] args) {
    3.        /*
    4.            创建Map的不可变集合,键值对的数量超过10个
    5.        */
    6.        //1.创建一个普通的Map集合
    7.        HashMap hm = new HashMap<>();
    8.        hm.put("张三", "南京");
    9.        hm.put("李四", "北京");
    10.        hm.put("王五", "上海");
    11.        hm.put("赵六", "北京");
    12.        hm.put("孙七", "深圳");
    13.        hm.put("周八", "杭州");
    14.        hm.put("吴九", "宁波");
    15.        hm.put("郑十", "苏州");
    16.        hm.put("刘一", "无锡");
    17.        hm.put("陈二", "嘉兴");
    18.        hm.put("aaa", "111");
    19.        //2.利用上面的数据来获取一个不可变的集合
    20. /*
    21.        //获取到所有的键值对对象(Entry对象)
    22.        Set> entries = hm.entrySet();
    23.        //把entries变成一个数组
    24.        Map.Entry[] arr1 = new Map.Entry[0];
    25.        //toArray方法在底层会比较集合的长度跟数组的长度两者的大小
    26.        //如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
    27.        //如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
    28.        Map.Entry[] arr2 = entries.toArray(arr1);
    29.        //不可变的map集合
    30.        Map map = Map.ofEntries(arr2);
    31.        map.put("bbb","222");*/
    32.        //Map map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
    33.        Map map = Map.copyOf(hm);
    34.        map.put("bbb","222");
    35.   }
    36. }
  • 相关阅读:
    Arthas使用总结
    c++图像的边缘检测
    Redis集群及分布式锁
    远程Linux ssh 免密登录(本机为Windows)
    Efficient Decision-based Black-box Adversarial Attacks on Face Recognition
    mysql group_concat and laravel group_concat使用
    JAVA毕业设计科技项目在线评审系统计算机源码+lw文档+系统+调试部署+数据库
    HTML+CSS期末大作业 中国传统美食网站设计 节日美食13页 html5网页设计作业代码 html制作网页案例代码 html大作业网页代码
    python获取文件路径
    Js节流防抖函数封装学习
  • 原文地址:https://blog.csdn.net/qq_69748833/article/details/132958197