使用 Collections.unmodifiableX() 构建只读集合,保护你的数据不被修改!

举报
喵手 发表于 2025/04/29 11:36:08 2025/04/29
270 0 0
【摘要】 开篇语哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

在 Java 中,我们经常需要构建不可修改的集合,以确保数据的一致性和防止意外修改。Java 提供了一个非常有用的工具类:Collections,它提供了多种方法来创建只读集合。今天,我们将重点讲解如何使用 Collections.unmodifiableX() 方法来构建只读集合,并了解它的实现原理和实际应用。

1. Collections.unmodifiableX() 方法概述

Collections.unmodifiableX() 是一个静态方法,它可以将一个现有的集合(如 ListSetMap)封装成一个不可修改的只读集合。这样一来,原集合的元素可以被访问,但不能进行任何修改(如增加、删除或修改元素)。

1.1 常用的 unmodifiableX() 方法

Collections 类提供了以下几种方法来构建不同类型的只读集合:

  • unmodifiableList(List<? extends T> list):返回一个不可修改的 List
  • unmodifiableSet(Set<? extends T> set):返回一个不可修改的 Set
  • unmodifiableMap(Map<? extends K, ? extends V> map):返回一个不可修改的 Map

这些方法都接受一个现有的集合,并返回一个不可修改的视图。


2. 如何使用 Collections.unmodifiableX() 构建只读集合

2.1 使用 unmodifiableList 创建只读 List

import java.util.*;

public class UnmodifiableListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 创建只读 List
        List<String> unmodifiableList = Collections.unmodifiableList(list);

        // 打印只读 List
        System.out.println("Unmodifiable List: " + unmodifiableList);

        // 尝试修改集合会抛出 UnsupportedOperationException
        try {
            unmodifiableList.add("Date");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the list: " + e);
        }
    }
}

输出:

Unmodifiable List: [Apple, Banana, Cherry]
Cannot modify the list: java.lang.UnsupportedOperationException

在这个例子中,我们创建了一个可修改的 ArrayList,然后通过 Collections.unmodifiableList() 方法将其封装成一个只读的 List。当我们尝试修改 unmodifiableList 时,抛出了 UnsupportedOperationException

2.2 使用 unmodifiableSet 创建只读 Set

import java.util.*;

public class UnmodifiableSetExample {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Cherry");

        // 创建只读 Set
        Set<String> unmodifiableSet = Collections.unmodifiableSet(set);

        // 打印只读 Set
        System.out.println("Unmodifiable Set: " + unmodifiableSet);

        // 尝试修改集合会抛出 UnsupportedOperationException
        try {
            unmodifiableSet.add("Date");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the set: " + e);
        }
    }
}

输出:

Unmodifiable Set: [Apple, Banana, Cherry]
Cannot modify the set: java.lang.UnsupportedOperationException

这里,我们使用 unmodifiableSet() 方法将一个普通的 HashSet 封装为只读集合,并验证了它无法进行修改。

2.3 使用 unmodifiableMap 创建只读 Map

import java.util.*;

public class UnmodifiableMapExample {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "Apple");
        map.put(2, "Banana");
        map.put(3, "Cherry");

        // 创建只读 Map
        Map<Integer, String> unmodifiableMap = Collections.unmodifiableMap(map);

        // 打印只读 Map
        System.out.println("Unmodifiable Map: " + unmodifiableMap);

        // 尝试修改集合会抛出 UnsupportedOperationException
        try {
            unmodifiableMap.put(4, "Date");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the map: " + e);
        }
    }
}

输出:

Unmodifiable Map: {1=Apple, 2=Banana, 3=Cherry}
Cannot modify the map: java.lang.UnsupportedOperationException

通过 unmodifiableMap() 方法,我们将一个可修改的 HashMap 封装成了只读 Map,并验证了它无法被修改。


3. 为什么要使用 unmodifiableX() 方法?

3.1 确保数据一致性

有时候,我们需要保护数据不被修改。通过使用 Collections.unmodifiableX() 方法构建只读集合,可以确保集合的内容不会被意外改变。特别是在多线程环境中,这样的保护可以避免线程安全问题。

3.2 提升代码安全性

通过明确创建不可修改的集合,我们能清晰地表达意图,减少开发中的错误。如果函数或类只需要读取数据而不修改数据,使用 unmodifiableX() 可以清晰地传达这一意图,并且减少无意中修改集合内容的风险。

3.3 限制外部修改

有时我们可能希望通过公共接口提供一个只读视图而不是直接暴露内部的集合。在这种情况下,使用 unmodifiableX() 方法可以确保外部不能修改集合内容,从而避免数据泄露或不一致的状态。


4. 注意事项

虽然 Collections.unmodifiableX() 方法为集合提供了只读视图,但它 并不会深度复制集合中的元素。如果原始集合发生了修改(例如添加或删除元素),这些变化会影响到只读集合。这意味着如果你需要完全保护数据,最好先复制一份集合再使用 unmodifiableX()

4.1 修改原集合会影响只读集合

import java.util.*;

public class ModifyOriginalCollection {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");

        // 创建只读 List
        List<String> unmodifiableList = Collections.unmodifiableList(list);

        // 修改原始集合
        list.add("Cherry");

        // 只读 List 会反映出修改
        System.out.println("Unmodifiable List after modification: " + unmodifiableList);
    }
}

输出:

Unmodifiable List after modification: [Apple, Banana, Cherry]

尽管 unmodifiableList 本身不可修改,但它仍然反映了原始集合的变化。如果你希望确保只读集合的数据不会发生变化,应该先复制集合:

List<String> unmodifiableList = Collections.unmodifiableList(new ArrayList<>(list));

5. 总结

  • Collections.unmodifiableX() 方法可以帮助你轻松创建只读集合,保护数据不被修改。
  • 使用它能够提高代码的安全性和稳定性,特别是在多线程环境下,防止数据被意外修改。
  • 需要注意,unmodifiableX() 创建的集合是视图,它不会深度复制元素,因此原始集合的修改会影响到只读集合。

通过合理使用 Collections.unmodifiableX() 方法,你可以更加精确地控制数据的访问权限,提升程序的可靠性。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。