当前位置: 首页 > article >正文

java基础概念55-不可变集合

一、定义

不可变集合:不可以被修改的集合,只能查询。(长度、内容均不可被修改)

二、创建不可变集合

【注意】:

此方法是在JDK9中引入的。

2-1、list不可变集合 

示例:

import java.util.List;

public class ListOfExample {
    public static void main(String[] args) {
        // 创建一个不可变的列表
        List<String> immutableList = List.of("apple", "banana", "cherry");

        // 尝试添加元素,会抛出 UnsupportedOperationException
        // immutableList.add("date"); 

        // 尝试修改元素,会抛出 UnsupportedOperationException
        // immutableList.set(0, "apricot"); 

        // 尝试删除元素,会抛出 UnsupportedOperationException
        // immutableList.remove("apple")

        // 遍历列表
        for (String fruit : immutableList) {
            System.out.println(fruit);
        }

        // 获取列表元素
        System.out.println(immutableList.get(0)); 
    }
}

使用 Collections.unmodifiableList 方法是在 JDK 8 中创建不可变 List 的一种常见方式。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ImmutableListExample {
    public static void main(String[] args) {
        // 创建一个可变的 ArrayList
        List<String> mutableList = new ArrayList<>();
        mutableList.add("Apple");
        mutableList.add("Banana");
        mutableList.add("Cherry");

        // 将可变的 ArrayList 转换为不可变的 List
        List<String> immutableList = Collections.unmodifiableList(mutableList);

        // 尝试添加元素,会抛出 UnsupportedOperationException
        // immutableList.add("Date");

        // 尝试修改元素,会抛出 UnsupportedOperationException
        // immutableList.set(0, "Apricot");

        // 遍历不可变的 List
        for (String fruit : immutableList) {
            System.out.println(fruit);
        }
    }
}

2-2、Set不可变集合 

 

【注意】:

若是Set.of赋值重复,会报错!

set集合是没有索引的!!!

使用 Collections.unmodifiableSet 方法是在 JDK 8 中创建不可变 List 的一种常见方式。

2-3、Map不可变集合 

1、键值对数量不超过10个

自动匹配键值对!

【注意】:

key不能重复,否则会报错!

 

【注意】:Map里面的of方法,参数是有上限的最多只能传递20个参数,10个键值对

原因:

可变参数必须在形参的最后!

 【解决】:将key, value看成一个整体!

 

2、键值对数量超过10个 

示例1:

简化:

示例2:

import java.util.Map;
import static java.util.Map.entry;

public class ImmutableMapExample {
    public static void main(String[] args) {
        // 创建包含多个键值对的不可变 Map
        Map<String, Integer> immutableMap = Map.ofEntries(
                entry("key1", 1),
                entry("key2", 2),
                entry("key3", 3),
                entry("key4", 4),
                entry("key5", 5),
                entry("key6", 6),
                entry("key7", 7),
                entry("key8", 8),
                entry("key9", 9),
                entry("key10", 10),
                entry("key11", 11)
        );

        // 尝试添加元素,会抛出 UnsupportedOperationException
        // immutableMap.put("key12", 12);

        // 尝试修改元素,会抛出 UnsupportedOperationException
        // immutableMap.put("key1", 100);

        // 遍历 Map
        for (Map.Entry<String, Integer> entry : immutableMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

如果,使用的 Java 版本低于 9,你可以使用 Collections.unmodifiableMap 方法将一个可变 Map 转换为不可变 Map

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class ImmutableMapBeforeJava9 {
    public static void main(String[] args) {
        Map<String, Integer> mutableMap = new HashMap<>();
        mutableMap.put("key1", 1);
        mutableMap.put("key2", 2);
        mutableMap.put("key3", 3);
        mutableMap.put("key4", 4);
        mutableMap.put("key5", 5);
        mutableMap.put("key6", 6);
        mutableMap.put("key7", 7);
        mutableMap.put("key8", 8);
        mutableMap.put("key9", 9);
        mutableMap.put("key10", 10);
        mutableMap.put("key11", 11);

        // 将可变 Map 转换为不可变 Map
        Map<String, Integer> immutableMap = Collections.unmodifiableMap(mutableMap);

        // 尝试添加元素,会抛出 UnsupportedOperationException
        // immutableMap.put("key12", 12);

        // 尝试修改元素,会抛出 UnsupportedOperationException
        // immutableMap.put("key1", 100);

        // 遍历 Map
        for (Map.Entry<String, Integer> entry : immutableMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

三、小结


http://www.kler.cn/a/503768.html

相关文章:

  • C++:string
  • 使用 configparser 读取 INI 配置文件
  • 无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型
  • 从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)
  • Redis优化建议详解
  • Springboot Rabbitmq + 线程池技术控制指定数量task执行
  • springcloud负载均衡原理
  • rtthread学习笔记系列--17IPC
  • android framework开发如何入门
  • 【Vue - Element 】实现表单输入框的远程搜索功能
  • 【OpenGL/Assimp】渲染模型、半透明材质与封装光源
  • Web开发(一)HTML5
  • Elasticsearch Python 客户端是否与自由线程 Python 兼容?
  • 关于2025年智能化招聘管理系统平台发展趋势
  • 单体 vs 微服务 怎么选?
  • springboot高校教室资源管理平台
  • 2501,wtl显示html
  • 基于springboot+vue的洪涝灾害应急信息管理系统设计与实现
  • 【蓝桥杯】Python算法——快速幂
  • Python文档生成利器 - Sphinx入门指南
  • 【JVM】深入了解Java虚拟机-------内存划分、类加载机制、垃圾回收机制
  • 【Uniapp-Vue3】页面生命周期onLoad和onReady
  • 语音合成的预训练模型
  • Linux Centos中安装多个JDK并且管理
  • 基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
  • 学习进程前的简单认知-体系结构与OS