不可变集合

一.创建不可变集合

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

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

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方法时都毫不意外的会报错,因为现在创建的是不可变集合
    }
}
相关推荐
满怀10151 分钟前
【HTML 全栈进阶】从语义化到现代 Web 开发实战
前端·html
悄悄地努力3 分钟前
IDEA 新建 SpringBoot 项目时,没有高版本 SpringBoot 可选
java·spring boot·intellij-idea
繁依Fanyi9 分钟前
用 UniApp 构建习惯打卡 App —— HabitLoop 开发记
javascript·uni-app·codebuddy首席试玩官
东锋1.312 分钟前
前端动画库 Anime.js 的V4 版本,兼容 Vue、React
前端·javascript·vue.js
满怀101525 分钟前
【Flask全栈开发指南】从零构建企业级Web应用
前端·python·flask·后端开发·全栈开发
救救孩子把43 分钟前
Mac 环境下 JDK 版本切换全指南
java·开发语言·macos
路飞雪吖~1 小时前
【Linux】共享内存
java·linux·服务器
小杨升级打怪中1 小时前
前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
前端·webpack·node.js
Yvonne爱编码1 小时前
CSS- 4.4 固定定位(fixed)& 咖啡售卖官网实例
前端·css·html·状态模式·hbuilder
caihuayuan41 小时前
鸿蒙AI开发:10-多模态大模型与原子化服务的集成
java·大数据·sql·spring·课程设计