【java10】集合中新增copyof创建只读集合

在Java中,集合(如List、Set、Map等)是编程中常用的数据结构。然而,在某些场景下,我们可能希望集合中的数据是只读的,即不允许修改集合中的元素。在Java8及之前,要实现这样的功能,我们通常需要使用Collections.unmodifiableList()等方法来创建集合的不可修改视图。在Java9中引入了of()方法来创建只读集合,在Java10中引入了copyOf()方法,为我们提供了更简洁、更直观的方式来创建只读集合。

集合的of()方法

List、Set、Map接口都有of()方法根据元素来创建只读集合,这里以List接口的of()方法为例,介绍of()方法的使用。

List.of()方法的使用:

java 复制代码
// JAVA9中新增创建只读的方法
var strings1 = List.of("Morris","JAVA","Golang");

集合的copyOf()方法

Java 10在List、Set和Map接口中引入了一个新的方法copyOf()。这个方法允许我们创建一个不可变的集合副本,以确保集合的内容不会被修改。

在List接口中,copyOf()方法返回一个包含指定列表中所有元素的不可变列表。这意味着无法通过该列表修改原始列表的内容。

在Set接口中,copyOf()方法返回一个包含指集合中所有元素不可变集合。同样地,这个集合不允许修改。

在Map接口中,copyOf()方法返回一个包含指定映射中所有键值对的不可变映射。这个不可变映射确保了映射的内容不会被修改。

使用copyOf()方法可以方便地创建不可变的集合,这对于保护数据的完整性和安全性非常有用。它还可以作为一种简化代码的方式,减少了手动创建不可变集合的工作量。

同样的List、Set、Map接口都有copyOf()方法根据一个集合来创建只读集合,这里以List接口的copyOf()方法为例,介绍copyOf()方法的使用。

在Java10中,List接口新增了一个copyOf方法,该方法接受一个列表作为参数,并返回一个包含该列表所有元素的新列表。重要的是,这个新列表是不可修改的,即你不能向其中添加、删除或修改元素。

以下是一个简单的示例,展示了如何使用copyOf方法创建只读集合:

java 复制代码
package com.morris.java10;

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

/**
 * 集合中新增copyof创建只读集合
 */
public class CollectionDemo {
    public static void main(String[] args) {

        // JAVA9中新增创建只读的方法
        var strings1 = List.of("Morris","JAVA","Golang");

        // 尝试修改只读列表(会抛出UnsupportedOperationException异常)
        // strings1.add("hello"); // 这行代码会抛出异常

        // JAVA10中新增的创建只读集合的方法
        var strings2 = List.copyOf(strings1); //判断两个集合在内存上是否是同一个,结果为true
        System.out.println(strings1==strings2); // true

        //创建一个普通集合
        var strings3=new ArrayList<String>();
        // 通过copy0f方法创建一个只读集合
        var strings4 = List.copyOf(strings3);
        //判断两个集合在内存上是否是同一个,结果为false
        System.out.println(strings3==strings4); // false

    }
}

List.copyOf()方法的源码

java.util.List#copyOf

java 复制代码
static <E> List<E> copyOf(Collection<? extends E> coll) {
    return ImmutableCollections.listCopy(coll);
}

java.util.ImmutableCollections#listCopy

java 复制代码
static <E> List<E> listCopy(Collection<? extends E> coll) {
    if (coll instanceof List12 || (coll instanceof ListN<?> c && !c.allowNulls)) {
        // 如果集合本身是一个不可变集合,就直接返回自己
        return (List<E>)coll;
    } else if (coll.isEmpty()) { // implicit nullcheck of coll
        // 如果集合是一个空集合,返回一个空的不可变集合
        return List.of();
    } else {
        // 使用现有集合创建一个新的不可变集合
        return (List<E>)List.of(coll.toArray());
    }
}
相关推荐
海南java第二人30 分钟前
Spring MVC核心流程深度解析:从请求到响应的完美掌控
java·springmvc
未来之窗软件服务30 分钟前
幽冥大陆(一百10)PHP打造Java的Jar安全——东方仙盟筑基期
java·php·phar·仙盟创梦ide·东方仙盟
程序猿_极客4 小时前
【2025 年最新版】Java JDK 安装与环境配置教程(附图文超详细,Windows+macOS 通用)
java·开发语言·windows·macos·jdk
猫头虎4 小时前
macOS 双开/多开微信WeChat完整教程(支持 4.X 及以上版本)
java·vscode·macos·微信·编辑器·mac·脚本
二哈喇子!7 小时前
Java开发工具——IDEA(修改全局配置,提升工作效率)
java·编辑器·intellij-idea
强子感冒了7 小时前
Java网络编程学习笔记,从网络编程三要素到TCP/UDP协议
java·网络·学习
二哈喇子!7 小时前
SpringBoot项目右上角选择ProjectNameApplication的配置
java·spring boot
sin22017 小时前
MyBatis的执行流程
java·开发语言·mybatis
二哈喇子!7 小时前
基于Spring Boot框架的车库停车管理系统的设计与实现
java·spring boot·后端·计算机毕业设计
二哈喇子!7 小时前
基于Spring Boot框架的网络游戏虚拟交易平台的设计与实现
java·springboot·毕设项目