JAVA不可变集合

即不可以被改变的集合
Snipaste_2024-01-31_20-57-04.png

应用场景:

简单理解:不想让别人修改集合中的内容时,就可以放入不可变集合


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

List 创建不可变集合:

Snipaste_2024-01-31_21-04-33.png
形参是可变参数,可以添加任意元素


List<String> list = List.of("zhangsan", "lisi", "wangwu");
//查
System.out.println(list.get(0));//zhangsan
//不能增删改---会报错
/*    list.add("aaa");
        list.remove(0);
        list.set(2,"bbb")*/

System.out.println("--------------");
//可以遍历---(以下是List的五种遍历方式,复习一下)
for (String s : list) {
    System.out.println(s);
}


System.out.println("-------------");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String str = it.next();
    System.out.println(str);
}


System.out.println("---------------");
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}


System.out.println("---------------");
list.forEach((s) -> System.out.println(s));


System.out.println("-------------");
ListIterator<String> stringListIterator = list.listIterator();
while (stringListIterator.hasNext()) {
    String str = stringListIterator.next();
    System.out.println(str);
}

Set 创建不可变集合:

image.png
形参是可变参数,可以添加任意元素

**细节:

    当我们要获取一个不可变的Set集合时,参数一定要保证唯一性,否则报错:<br />![Snipaste_2024-01-31_21-21-46.png](https://cdn.nlark.com/yuque/0/2024/png/40571611/1706710878225-53db3e63-04c7-4f4a-9aa9-d8b8dd095a24.png#averageHue=%23f9f7f5&clientId=u3e0bafb0-1ee4-4&from=drop&height=210&id=ucd70692e&originHeight=595&originWidth=1861&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=109489&status=done&style=shadow&taskId=uad672bfc-e8eb-4064-9a89-3e4666c47c4&title=&width=656)

Set<String> set = Set.of("zhangsan", "lisi", "wangwu");
//因为Set系列集合没有索引索引不能使用get方法,但是我们可以遍历
//不能增删改

System.out.println("--------------");
//可以遍历---(以下是Set的三种遍历方式,复习一下)
for (String s : set) {
    System.out.println(s);
}


System.out.println("-------------");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
    String str = it.next();
    System.out.println(str);
}


System.out.println("---------------");
set.forEach((s) -> System.out.println(s));

Map 创建不可变集合:

细节:

键不能重复

当要添加的键值对数量少于 10个,直接时使用 Of 方法创建不可变集合:
因为 of 方法最多创建十个键值对对象:
Snipaste_2024-01-31_21-46-01.png

 Map<String, String> map = Map.of("刘一", "南昌", "张三", "上海", "王五", "北京", "孙七", "深圳", "吴九", "上饶");


    	//以下是Map的三种遍历方式:
        //keySet
        Set<String> set = map.keySet();
        for (String s : set) {
            System.out.println(s+" ="+map.get(s));
        }


        System.out.println("--------------------------");
        //entrySet
        Set<Map.Entry<String, String>> entries = map.entrySet();
        for (Map.Entry<String, String> entry : entries) {
            System.out.println(entry.getKey()+" ="+entry.getValue());
        }

        System.out.println("--------------------------");

        //forEach
        map.forEach(new BiConsumer<String, String>() {
            @Override
            public void accept(String s, String s2) {
                System.out.println(s+" "+s2);
            }
        });

当要添加的键值对数量大于 10个,使用 ofEntries 方法 或直接点,使用 Copyof 方法创建不可变集合

//1.创建一个普通的Map集合
HashMap<String, String> hm = new HashMap<>();
hm.put("张三", "南京");
hm.put("李四", "北京");
hm.put("王五", "上海");
hm.put("赵六", "北京");
hm.put("孙七", "深圳");
hm.put("周八", "杭州");
hm.put("吴九", "宁波");
hm.put("郑十", "苏州");
hm.put("刘一", "无锡");
hm.put("陈二", "嘉兴");
hm.put("aaa", "111");
//一共十一个键值对对象

//目的:利用上面的数据来获取一个不可变集合

//1.entrySet方法获取到键值对对象
Set<Map.Entry<String, String>> entries = hm.entrySet();
//2.创建一个Entry数组,用于存储键值对。
Map.Entry[] arr1 = new Map.Entry[0];
        
//3.把entries变成一个数组
//toArray方法在底层会比较集合的长度跟数组的长度两者的大小
//如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
//如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用
Map.Entry[] arr2 = entries.toArray(arr1);
//不可变的map集合
Map map = Map.ofEntries(arr2);

//或直接写成下面这种
Map<Object, Object> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
//或直接调用compyOf方法,它底层其实就是使用上面这个
Map<String, String> map = Map.copyOf(hm);

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成果、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值