导读:本期聚焦于小伙伴创作的《在Java中如何使用Collections.unmodifiableXXX创建不可变集合》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在Java中如何使用Collections.unmodifiableXXX创建不可变集合》有用,将其分享出去将是对创作者最好的鼓励。

在Java集合框架中,Collections类提供了一系列unmodifiableXXX静态方法,用于创建对应集合的不可变视图,让开发者可以快速得到不可被修改的集合实例,在需要保护集合数据不被篡改的场景下非常实用。

在Java中如何使用Collections.unmodifiableXXX创建不可变集合

Collections.unmodifiableXXX系列方法概述

Collections工具类针对常见的集合类型都提供了对应的不可变视图创建方法,主要包括以下几类:

  • unmodifiableList(List<? extends T> list):创建不可变的List视图
  • unmodifiableSet(Set<? extends T> set):创建不可变的Set视图
  • unmodifiableMap(Map<? extends K, ? extends V> map):创建不可变的Map视图
  • unmodifiableSortedSet(SortedSet<T> set):创建不可变的排序Set视图
  • unmodifiableSortedMap(SortedMap<K, V> map):创建不可变的排序Map视图
  • unmodifiableNavigableSet(NavigableSet<T> set):创建不可变的导航Set视图
  • unmodifiableNavigableMap(NavigableMap<K, V> map):创建不可变的导航Map视图

基础使用示例

创建不可变List

首先创建可变的原始List,再通过Collections.unmodifiableList得到不可变视图,后续对不可变视图的修改操作会直接抛出异常。

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

public class UnmodifiableListDemo {
    public static void main(String[] args) {
        // 创建原始可变List
        List<String> originalList = new ArrayList<>();
        originalList.add("Java");
        originalList.add("Python");
        originalList.add("Go");

        // 创建不可变List视图
        List<String> unmodifiableList = Collections.unmodifiableList(originalList);

        // 读取操作正常执行
        System.out.println("不可变List内容:" + unmodifiableList);
        System.out.println("第一个元素:" + unmodifiableList.get(0));

        // 尝试修改不可变List,会抛出UnsupportedOperationException
        try {
            unmodifiableList.add("C++");
        } catch (UnsupportedOperationException e) {
            System.out.println("添加元素失败:" + e.getMessage());
        }

        // 修改原始List,不可变视图的内容会同步变化
        originalList.add("C++");
        System.out.println("修改原始List后,不可变List内容:" + unmodifiableList);
    }
}

创建不可变Map

Map的不可变视图创建方式和List类似,同样支持读取操作,不支持修改操作。

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

public class UnmodifiableMapDemo {
    public static void main(String[] args) {
        // 创建原始可变Map
        Map<String, Integer> originalMap = new HashMap<>();
        originalMap.put("Java", 1);
        originalMap.put("Python", 2);
        originalMap.put("Go", 3);

        // 创建不可变Map视图
        Map<String, Integer> unmodifiableMap = Collections.unmodifiableMap(originalMap);

        // 读取操作正常执行
        System.out.println("不可变Map内容:" + unmodifiableMap);
        System.out.println("Java对应的值:" + unmodifiableMap.get("Java"));

        // 尝试修改不可变Map,会抛出UnsupportedOperationException
        try {
            unmodifiableMap.put("C++", 4);
        } catch (UnsupportedOperationException e) {
            System.out.println("添加键值对失败:" + e.getMessage());
        }
    }
}

核心特性解析

不可变视图不等于不可变集合

需要特别注意,Collections.unmodifiableXXX创建的是原始集合的不可变视图,而不是完全独立的不可变集合。如果原始集合被修改,不可变视图的内容也会随之变化,这一点从上面的List示例中可以看到。如果需要完全独立的不可变集合,需要先复制原始集合的内容,再创建不可变视图。

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

public class IndependentUnmodifiableDemo {
    public static void main(String[] args) {
        List<String> originalList = new ArrayList<>();
        originalList.add("Java");
        originalList.add("Python");

        // 先复制原始集合内容,再创建不可变视图,得到完全独立的不可变集合
        List<String> copyList = new ArrayList<>(originalList);
        List<String> independentUnmodifiableList = Collections.unmodifiableList(copyList);

        // 修改原始集合,不可变视图内容不会变化
        originalList.add("Go");
        System.out.println("原始List:" + originalList);
        System.out.println("独立不可变List:" + independentUnmodifiableList);
    }
}

修改操作会抛出的异常

对不可变视图执行任何修改操作,包括添加、删除、替换元素等,都会抛出UnsupportedOperationException,这是运行时异常,不需要强制捕获,但开发中需要避免此类操作。

支持所有集合的读取操作

不可变视图只是禁止了修改操作,所有的读取操作,比如size()get()contains()iterator()等都可以正常执行,和原始集合的读取行为一致。

适用场景

  • 当需要将集合作为参数传递给其他方法,且不希望方法内部修改集合内容时,可以传递不可变视图,避免外部集合被意外修改。
  • 当集合的内容在初始化后不需要再变化,且需要对外暴露时,可以返回不可变视图,保护内部数据。
  • 在多线程场景下,如果集合初始化后不再修改,使用不可变视图可以避免额外的同步开销,因为不可变对象本身就是线程安全的。

和其他不可变集合方式的对比

除了Collections.unmodifiableXXX,Java中还有其他创建不可变集合的方式,比如Java 9+的List.of()Set.of()Map.of()方法,以及Guava库的不可变集合工具类。它们的区别如下:

方式是否独立不可变是否允许null元素适用Java版本
Collections.unmodifiableXXX否(是视图)允许(取决于原始集合)所有Java版本
List.of()/Set.of()/Map.of()不允许Java 9及以上
Guava不可变集合不允许所有Java版本(需引入依赖)

注意事项

  • 不要对不可变视图执行修改操作,否则会抛出运行时异常,影响程序正常运行。
  • 如果原始集合是可变的,且后续可能被修改,那么不可变视图的内容也会变化,需要根据需求判断是否需要复制原始集合内容。
  • 不可变视图的迭代器也是不可变的,调用迭代器的remove()方法同样会抛出UnsupportedOperationException
使用Collections.unmodifiableXXX创建不可变集合时,要明确其视图特性,根据实际场景选择是否需要复制原始集合,避免因为原始集合的修改导致不可变视图的内容不符合预期。

JavaCollections.unmodifiableXXX不可变集合集合操作修改时间:2026-07-04 22:51:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。