java中创建不可变集合

一.应用场景

二.创建不可变集合的书写格式(List,Set,Map)

List集合

java 复制代码
package com.njau.d9_immutable;

import java.util.Iterator;
import java.util.List;

/**
 * 创建不可变集合:List.of()方法
 * "张三","李四","王五","赵六"
 * 创建不可变集合的书写形式
 *      在List、Set、Map接口中,都存在静态的of方法,可以获取一个不可变的集合。
 *      方法名称
 *      static<E>   List<E>     of(E...elements)            创建一个具有指定元素的List集合对象
 *      static<E>   set<E>     of(E...elements)             创建一个具有指定元素的Set集合对象
 *      static<K,V>     Map<K,V>    of(E...elements)            创建一个具有指定元素的Map集合对象
 *      注意:这个集合不能添加,不能删除,不能修改
 */
public class ImmutableDemo1 {
    public static void main(String[] args) {
        List<String> list = List.of("张三","李四","王五","赵六");
        System.out.println(list.get(0));
        System.out.println(list.get(1));
        System.out.println(list.get(2));
        System.out.println(list.get(3));
        System.out.println("-----------------------------------");

        for (String s : list) {
            System.out.println(s);
        }

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

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

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

       /*
        都会报错
        list.add("aaa");
        list.remove("张三");
        list.set(0,"洪七");
        */
    }
}

Set集合

java 复制代码
package com.njau.d9_immutable;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class ImmutableDemo2 {
    public static void main(String[] args) {
        // 创建不可变的Set集合
        // 细节:当我们要获取一个不可变的set集合的时候,要满足set集合的要求,即集合中的元素不能重复
        // "张三","李四","王五","赵六"
        Set<String> set = Set.of("张三","李四","王五","赵六");


        for (String s : set) {
            System.out.println(s);
        }

        Iterator<String> it = set.iterator();
        while(it.hasNext()) {
            String next = it.next();
            System.out.println(next);
        }
/*
        set.add("萌二");
        set.remove("王五");*/
    }
}

Map集合

java 复制代码
package com.njau.d9_immutable;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ImmutableDemo3 {
    public static void main(String[] args) {
        /*
         *  创建不可变的Map集合
         *  细节1:Map集合中的元素是不可重复的
         *  细节2:Map里面的of方法,参数是有上限的,最多只能传递20个参数,10个键值对
         *  细节3:如果想要定义大于20个参数的不可变map对象,那么必须使用entries。即将key和value看作一个整体,再使用可变参数
         */
        Map<String, String> map = Map.of("张三", "南京", "李四", "北京", "王五", "上海", "赵六",
                "广州", "孙七", "深圳", "周八", "杭州", "武九", "宁波", "郑十", "苏州",
                "刘一", "无锡", "陈二", "嘉兴");

        Set<String> set = map.keySet();
        for (String key : set) {
            String value = map.get(key);
            System.out.println(key + "=" + value);
        }

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

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


    }
    // 可变参数只能有一个,且放在参数的最后,因此无法设计
    /*
    public static<K,V> void of(K...keys,V...values) {
    }
    */
}

当使用Map集合时,其中的<K,V>参数最多只能有10对。参见下面的Map.of源码:

java 复制代码
static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5,
                               K k6, V v6, K k7, V v7, K k8, V v8, K k9, V v9, K k10, V v10) {
        return new ImmutableCollections.MapN<>(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5,
                                               k6, v6, k7, v7, k8, v8, k9, v9, k10, v10);
    }

那么,当我们想要使用不可变的Map集合存储超过10个键值对元素的时候,该怎么办呢?请看三。

三.任意容量大小的不可变Map集合的建立

方法一:将<K,V>看作一个整体使用entrySet方法,将其作为一个整体存储在Set集合中,然后再使用toArray(T[])方法将Set集合转换为一个Map.Entry类型的数组(因为可变参数的本质是一个数组,而想要传递无限量的参数就必须使用可变参数,因此要将其转为数组)。而ofEntries(Entry<? extends K, ? extends V>... entries)方法就是用来接受一个可变参数(数组),存储在不可变的Map集合中。

java 复制代码
package com.njau.d9_immutable;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 使用entry类型实现不可变的map集合构建
 */
public class ImmutableDemo4 {
    public static void main(String[] args) {
        Map<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","aaa");

        Set<Map.Entry<String, String>> entries = hm.entrySet();

        // 该数组大小没关系,因为大了会将多余空间置为null,小了会进行自动扩容
        Map.Entry[] arr2 = new Map.Entry[0];

        // 调用toArray(数组参数类型)方法将entries对象转换为Entries数组(可变参数)
        Map.Entry[] arr1 = entries.toArray(arr2);

        // 将Entries数组传入Map.ofEntries方法,生成一个不可变的Map集合
        Map map = Map.ofEntries(arr1);

        map.put("bbb","222");
    }
}
java 复制代码
package com.njau.d9_immutable;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 使用entry类型实现不可变的map集合构建
 */
public class ImmutableDemo4 {
    public static void main(String[] args) {
        Map<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","aaa");


        // 链式编程
        Map<String, String> map = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
        map.put("bbb","333");
    }
}

方法二:使用Map.copyOf直接生成一个不可变的Map集合(底层代码和上面原理一模一样)

java 复制代码
package com.njau.d9_immutable;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 使用entry类型实现不可变的map集合构建
 */
public class ImmutableDemo4 {
    public static void main(String[] args) {
        Map<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","aaa");

        Map<String, String> map1 = Map.copyOf(hm);
        map1.put("ttt","777");


    }
}
相关推荐
睆小白9 分钟前
【springboot】整合沙箱支付
java·spring boot·后端
奇客软件13 分钟前
如何从 Windows 11/10/8.1/8/7 中恢复已删除的视频
windows·macos·智能手机·手机·笔记本电脑·excel·音视频
s_little_monster23 分钟前
【C++】多态(上)
开发语言·c++·经验分享·笔记·学习·学习方法
sysin.org24 分钟前
VMware ESXi 6.7U3u macOS Unlocker 集成驱动版更新 OEM BIOS 2.7 支持 Windows Server 2025
windows·macos·esxi·rtl·oem·网卡驱动
卑微求AC26 分钟前
(C语言贪吃蛇)12.Linux线程概念引入及编程实现
linux·c语言·开发语言
风槐啊26 分钟前
四、Java 基础语法
java·开发语言·markdown
原机小子31 分钟前
SpringBoot在校园健康管理中的应用
java·spring boot·后端
Supreme_Sir42 分钟前
Java 图片合成
java·图像处理·文本·二维码·图片合成·jai
梦幻通灵43 分钟前
Postman另存的curl脚本调试运行
java·开发语言·ide