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");


    }
}
相关推荐
神奇夜光杯几秒前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue2 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
plmm烟酒僧4 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
测试界的酸菜鱼15 分钟前
Python 大数据展示屏实例
大数据·开发语言·python
让学习成为一种生活方式19 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画25 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend33 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
希言JY1 小时前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
残月只会敲键盘1 小时前
php代码审计--常见函数整理
开发语言·php