Java 创建不可变聚集

[复制链接]
发表于 2025-12-23 17:13:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
        Java中为了安全起见,偶然间不想让别人改聚集中的数据,那么就可以使用不可变聚集。
  1. package listExercise;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import java.util.Set;
  5. /**
  6. * 不可变集合
  7. * 长度不变,内容无法修改的集合
  8. * 当集合中的数据不能被修改,那么将其拷贝到不可变集合中就是一种很好的防御手段
  9. * 有些情况,不想让他人改变集合的内容,那么就需要使用不可变集合;
  10. */
  11. public class ListExercise {
  12.     public static void main(String[] args) {
  13.         // 不可变的集合有不可变List、不可变Set、不可变Map
  14.         // 不可变List
  15.         // 使用List.of方法创建一个不可变的List集合
  16. //        List<String> list= List.of("张三","李四","王五","赵六");
  17. //        // 发现使用List.of方法创建的集合是不可变的集合,只能查询,无法修改
  18. //        // 不可变的集合可以正常查询
  19. //        for (String s : list) {
  20. //            System.out.println(s);
  21. //        }
  22. //        // 但是想要改变这个集合是不可以的,无法通过编译
  23. //        list.remove(0);
  24. //        list.remove("张三");
  25. //        list.add("前七");
  26. //        // 不可变的Set集合
  27. //        // 不可变的Set大部分情况下和不可变List类似,但是使用of方法创建集合的时候,参数必须保证唯一性
  28. //        Set<String> set = Set.of("张三","李四","王五","赵六");
  29. //        for (String s : set) {
  30. //            System.out.println(s);
  31. //        }
  32. //        // 使用Set.of创建集合的时候,参数必须保证唯一性,否则直接编译错误
  33. //        Set<Integer> errorSet = Set.of(1,2,3,4,5,5);
  34. //        set.remove("王五");
  35. //        set.add("13");
  36. //        set.remove("李四");
  37.         // 不可变的Map集合
  38.         // 如果使用Map.of方法,参数的键值对个数最多10个,其不支持不定参数的写法:
  39.         // 因为不定参数只能有一个,并且必须写在参数列表的最后;但是Map中键值对一一对应,必须有两个不定参数,这是不符合语法的
  40.         // 假如说想要传递多个键值对对象,数量大于10个,那么不能使用Map.of方法
  41.         // Map.of方法不能传递相同的键,否则直接编译报错
  42. //        Map<String, String> map = Map.of("张三", "南京", "张三", "北京", "王五", "上海",
  43. //                "赵六", "广州", "孙七", "深圳", "周八", "杭州",
  44. //                "吴九", "宁波", "郑十", "苏州", "刘一", "无锡",
  45. //                "陈二", "嘉兴");
  46. //        put方法可以传递相同的键,以后面的键值为准
  47. //        Map<String, String> map1 = new HashMap<>();
  48. //        map1.put("zhangsan", "123");
  49. //        map1.put("zhangsan", "123");
  50.         // 创建一个不可变的Map对象,键值对的数量不超过10
  51. //        Map<String, String> map = Map.of("张三", "南京", "王五", "上海",
  52. //                "赵六", "广州", "孙七", "深圳", "周八", "杭州",
  53. //                "吴九", "宁波", "郑十", "苏州", "刘一", "无锡",
  54. //                "陈二", "嘉兴");
  55. //
  56. //        // 通过得到keySet,然后遍历key得到value
  57. //        Set<String> keySet = map.keySet();
  58. //        for (String key : keySet) {
  59. //            String value = map.get(key);
  60. //            System.out.println(value + " " + key);
  61. //        }
  62. //
  63. //        // 通过获得键值对集合,直接遍历
  64. //        Set<Map.Entry<String, String>> entries = map.entrySet();
  65. //        for (Map.Entry<String, String> entry : entries) {
  66. //            System.out.println(entry.getKey() + " " + entry.getValue());
  67. //        }
  68. //
  69. //        // 修改map失败
  70. //        map.remove("张三");
  71. //        map.put("123", "456");
  72.         // 创建一个不可变的Map对象,但是键值对超过10
  73.         // 创建一个普通的map对象
  74.         HashMap<String, String> map = new HashMap<>();
  75.         map.put("张三", "南京");
  76.         map.put("李四", "北京");
  77.         map.put("王五", "上海");
  78.         map.put("赵六", "北京");
  79.         map.put("孙七", "深圳");
  80.         map.put("周八", "杭州");
  81.         map.put("吴九", "宁波");
  82.         map.put("郑十", "苏州");
  83.         map.put("刘一", "无锡");
  84.         map.put("陈二", "嘉兴");
  85.         map.put("aaa", "111");
  86. //        // 利用上面的map对象创建一个不可变的map
  87. //        // 获取所有键值对对象
  88. //        Set<Map.Entry<String, String>> entries = map.entrySet();
  89. //        // 将entries变为数组
  90. //        // 先创建一个数组,用于存储键值对
  91. //        // 此处的数组大小可以随意,后面toArray会自己调整
  92. //        Map.Entry[] array = new Map.Entry[0];
  93. //        // toArray方法在底层会比较集合的长度跟数组的长度两者的大小
  94. //        // 如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
  95. //        // 如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
  96. //        // 成功将原hashMap中的键值对转化为了数组
  97. //        Map.Entry[] mapArray = entries.toArray(array);
  98. //        // 用这个键值对数组创建不可变的map
  99. //        Map map1 = Map.ofEntries(mapArray);
  100. //        // 不可变的map,修改直接报错
  101. //        map1.put("1230", "4567");
  102. //
  103. //        // 简便方法,在JDK10之前,需要将普通Map的键值对,转化为entries集合对象;再创建一个Map.Entry类型的数组
  104. //        // 再通过这个数组(作为模板),将entries对象转换为Map.Entry类型的数组,然后再用这个数组,作为Map.ofEntries方法的参数,创造不可变的map
  105. //
  106. //        // JDK10之后的简便方法
  107. //        // copyOf底层实现也是用的上面的方法,只是JDK对其进行了封装
  108. //        Map<String, String> easyMap = Map.copyOf(map);
  109. //        easyMap.put("132", "123");
  110.         // 获取Map中的键值对集合
  111.         Set<Map.Entry<String, String>> entries = map.entrySet();
  112.         // 创建一个Map.Entry类型的数组,用于调用entries中toArray方法时指定数组类型
  113.         Map.Entry[] entryArray = new Map.Entry[0];
  114.         // 将Map中的键值存到Map.Entry数组中
  115.         Map.Entry[] array = entries.toArray(entryArray);
  116.         // 使用Map中的ofEntries方法使用原Map中的entry数组创建一个不可变的Map
  117.         Map map2 = Map.ofEntries(array);
  118.         System.out.println(map2);
  119.         // JDK10之后的简便转换方法
  120.         Map<String, String> easyMap = Map.copyOf(map);
  121.         System.out.println(easyMap);
  122.     }
  123. }
复制代码

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表