java 11 不可修改集合API

不可修改集合API

自 Java 9 开始,Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。

示例1:

1var list = List.of("Java", "Python", "C"); 2var copy = List.copyOf(list); 3System.out.println(list == copy); // true

示例2:

1var list = new ArrayList<String>(); 2 3var copy = List.copyOf(list); 4 5System.out.println(list == copy); // false

示例1和2代码差不多,为什么一个为true,一个为false?

来看下它们的源码:

of:

1static <E> List<E> of(E... elements) { 2 switch (elements.length) { // implicit null check of elements 3 case 0: 4 return ImmutableCollections.emptyList(); 5 case 1: 6 return new ImmutableCollections.List12<>(elements[0]); 7 case 2: 8 return new ImmutableCollections.List12<>(elements[0], elements[1]); 9 default: 10 return new ImmutableCollections.ListN<>(elements); 11 } 12}

copyOf:

1static <E> List<E> copyOf(Collection<? extends E> coll) { 2 return ImmutableCollections.listCopy(coll); 3}

listCopy:

1static <E> List<E> listCopy(Collection<? extends E> coll) { 2 if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) { 3 return (List<E>)coll; 4 } else { 5 return (List<E>)List.of(coll.toArray()); 6 } 7} 8 9

可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。

示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.

注意:使用of和copyOf创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有。

除了更短和更好阅读之外,这些方法也可以避免您选择特定的集合实现。在创建后,继续添加元素到这些集合会导致 “UnsupportedOperationException” 。

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

说说Python集合的那些事儿

大家好,我是IT共享者,人称皮皮。今天给大家来捋一捋Python集合。一、什么是集合?集合(set)和字典(dict)类似,它是一组key的集合,但不存储value。集合的特性就是:key不能重复。二、集合常用操作1\.创建集合set的创建可以使用也可以使用set函数:s1'a','b','c','a','d','b'

Python 集合(Sets)1

集合集合用于在单个变量中存储多个项。集合是Python中的4种内置数据类型之一,用于存储数据集合,其他3种是列表(List)、元组(Tuple)和字典(Dictionary),它们都具有不同的特性和用途。集合是一种无序、不可更改()、无索引的集合。创建一个

Java深究之Vector、ArrayList、LinkedList的区别

       在java开发中除了上文经常用的对字符串的操作外,还有使用居多的当属集合了。在基础的java学习时,相信很多同学都学习了List、Set、Map这些,他们之间的区别和基本的使用方法也是很了解了,本文是详细的去分析List中Vector、ArrayList、LinkedList之间的区别和底层实现原理以及使用场景首先说下这三者的区别:

10. Scala数据结构(上)

10.1数据结构特点   10.1.1Scala集合基本介绍       uml统一建模语言      1)Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问      两个主要的包      不可变集合:scala.collection.immutable      

Java中如何克隆集合——ArrayList和HashSet深拷贝

编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法。需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味着存储在原始List和克隆List中的对象是相同的,指向Java堆内存中相同的位置。增加了这个误解的原因之一是对于不可变对象(https:/

java 11 不可修改集合API - HelloWorld