不可变集合

一.创建不可变集合

不可变集合:不可以被修改的集合,一旦被创建之后,长度和内容均不可修改

创建不可变集合的应用场景:

1.如果某个数据不能够,也不应该被修改,把它存入不可变集合中

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

(也就是说在不想让别人修改集合中的内容时用到不可变集合)

创建不可变集合的书写格式:(要注意此时创建的都是不可变集合,其中的内容无法进行修改)

static<E> List<E> of(E...elements)创建一个具有指定元素的List集合对象

java 复制代码
import java.util.Iterator;
import java.util.List;

public class ImmutableCollection {
    public static void main(String[] args) {
        List<String> list = List.of("A", "B", "C", "D");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
        list.remove("A");//报错
        list.add("a");//报错
        list.set(0, "a");//报错
    }
}

static<E> set<E> of(E...elements)创建一个具有指定元素的Set对象

(在创建Set对象的不可变集合时的注意事项:要保证其中元素的唯一性)

java 复制代码
import java.util.Iterator;
import java.util.Set;

public class ImmutableCollection {
    public static void main(String[] args) {
        Set<String> s = Set.of("A", "B", "C", "D");
        Iterator<String> it = s.iterator();
        while (it.hasNext()) {
            String str = it.next();
            System.out.println(str);
        }
        s.remove("A");//报错
    }
}

static<K,V> Map<K,V> of(E...elements)创建一个具有指定元素的Map集合对象

(在创建Map对象的不可变集合时的注意事项:

1.键是不能重复的

2.Map中的of方法可传递的参数是有上限的,最多只能传递20个参数,即10个键值对对象

3.如果我们要传递多个键值对对象,且其数量大于10个,这时可以使用Map接口中的一个方法)

java 复制代码
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MoreMap {
    public static void main(String[] args) {
        HashMap<String, String> hm = new HashMap<>();
        hm.put("A", "a");
        hm.put("B", "b");
        hm.put("C", "c");
        hm.put("D", "d");
        hm.put("E", "e");
        hm.put("F", "f");
        hm.put("G", "g");
        hm.put("H", "h");
        hm.put("I", "i");
        hm.put("J", "j");
        hm.put("K", "k");
        hm.put("L", "l");
        hm.put("M", "m");
        hm.put("N", "n");
        //获取到所有的Entries键值对对象
        Set<Map.Entry<String, String>> entries = hm.entrySet();
        //将所有的键值对对象存入一个数组中
        Map.Entry[] arr1 = new Map.Entry[0];
        /*toArray方法在底层会比较集合的长度和数组的长度两者的大小
        若集合的长度大于数组的长度,数据在数组中放不下,此时会返回实际数据的个数,重新创建数组
        若集合的长度小于等于数组的长度,数据能够存储在数组之中,此时不会创建新的数组,直接使用创建好的数组即可
         */
        Map.Entry[] arr2 = entries.toArray(arr1);
        //现在就可以创建不可变的Map集合
        Map map1 = Map.ofEntries(arr2);
        map1.put("a", "1");

        //简化方式
        Map<Object, Object> map2 = Map.ofEntries(hm.entrySet().toArray(new Map.Entry[0]));
        map2.put("b", "2");

        //Map接口中的copyOf方法更能简化这一过程(JDK10时才加入)
        Map<String, String> map3 = Map.copyOf(hm);
        map3.put("c", "3");
        //当然三个创建的map在调用put方法时都毫不意外的会报错,因为现在创建的是不可变集合
    }
}
相关推荐
JUNAI_Strive_ving11 分钟前
番茄小说逆向爬取
javascript·python
救救孩子把13 分钟前
深入理解 Java 对象的内存布局
java
落落落sss15 分钟前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
看到请催我学习20 分钟前
如何实现两个标签页之间的通信
javascript·css·typescript·node.js·html5
万物皆字节21 分钟前
maven指定模块快速打包idea插件Quick Maven Package
java
夜雨翦春韭27 分钟前
【代码随想录Day30】贪心算法Part04
java·数据结构·算法·leetcode·贪心算法
我行我素,向往自由34 分钟前
速成java记录(上)
java·速成
twins352040 分钟前
解决Vue应用中遇到路由刷新后出现 404 错误
前端·javascript·vue.js
一直学习永不止步40 分钟前
LeetCode题练习与总结:H 指数--274
java·数据结构·算法·leetcode·数组·排序·计数排序
邵泽明40 分钟前
面试知识储备-多线程
java·面试·职场和发展