java 11 不可修改集合API

Wesley13
• 阅读 511

不可修改集合API

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

示例1:

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

示例2:

var list = new ArrayList<String>();

var copy = List.copyOf(list);

System.out.println(list == copy); // false

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

来看下它们的源码:

of:

static <E> List<E> of(E... elements) {
  switch (elements.length) { // implicit null check of elements
    case 0:
        return ImmutableCollections.emptyList();
    case 1:
        return new ImmutableCollections.List12<>(elements[0]);
    case 2:
        return new ImmutableCollections.List12<>(elements[0], elements[1]);
    default:
        return new ImmutableCollections.ListN<>(elements);
  }
}

copyOf:

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

listCopy:

static <E> List<E> listCopy(Collection<? extends E> coll) {
    if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {
        return (List<E>)coll;
    } else {
        return (List<E>)List.of(coll.toArray());
    }
}

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

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

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

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

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
11个月前
Java中Map,List与Set的区别
首先,数组和集合的区别: * 数组是大小固定的 * 集合可以存储和操作数目不固定的一组数据,集合只能存放引用类型的的数据,不能存放基本数据类型 特性 -- ### List * 允许重复 * 有序 * 继承自`Connection` ### Set * 不允许重复 * 无序 * 继承自`Connection` #
Wesley13 Wesley13
11个月前
Java深究之Vector、ArrayList、LinkedList的区别
        在java开发中除了上文经常用的对字符串的操作外,还有使用居多的当属集合了。在基础的java学习时,相信很多同学都学习了List、Set、Map这些,他们之间的区别和基本的使用方法也是很了解了,本文是详细的去分析List中Vector、ArrayList、LinkedList之间的区别和底层实现原理以及使用场景 首先说下这三者的区别: *
Wesley13 Wesley13
11个月前
Java常见面试题总结
一、Java基础 1、String类为什么是final的。 2、HashMap的源码,实现原理,底层结构。 3、说说你知道的几个Java集合类:list、set、queue、map实现类咯。。。 4、描述一下ArrayList和LinkedList各自实现和区别 5、Java中的队列都有哪些,有什么区别。 6、反射中,Class.forName和
可莉 可莉
11个月前
10. Scala数据结构(上)
10.1 数据结构特点  ------------ ###   10.1.1 Scala集合基本介绍        uml => 统一建模语言       1) Scala同时支持不可变集合和可变集合,不可变集合可以安全的并发访问       两个主要的包       不可变集合:scala.collection.immutable       
Wesley13 Wesley13
11个月前
JAVA之forEach遍历集合
JAVA之forEach遍历集合 ================ * **在JDK 8中,根据Lambda表达式的特性还增加了一个forEach(Consumer action)方法来遍历集合,该方法所需要的参数是一个函数式接口** import java.util.ArrayList; import java.util.List;
Wesley13 Wesley13
11个月前
Java入门第五篇:Java集合框架的Collection、List、Set、Map接口
【java的集合框架】  Collection:       1.List         ①ArrayList         ②LinkedList       2.set         ①HashSet         ②LinkedHashSet         ③TreeSet Map:        1.HashMap  
Wesley13 Wesley13
11个月前
Java中的集合
Java Collections Framework是Java编程语言的核心部分之一。集合几乎用于任何编程语言中。大多数编程语言都支持各种类型的集合,例如List, Set, Queue, Stack等。 ### 1.什么是Java Collections Framework? 集合就像容器一样,将多个项目组合在一个单元中。例如,一罐巧克力,一组名称等。
Wesley13 Wesley13
11个月前
Java中如何克隆集合——ArrayList和HashSet深拷贝
编程人员经常误用各个集合类提供的拷贝构造函数作为克隆`List`,`Set`,`ArrayList`,`HashSet`或者其他集合实现的方法。需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味着存储在原始List和克隆List中的对象是相同的,指向Java堆内存中相同的位置。增加了这个误解的原因之一是对于[不可变对象](https:/
Wesley13 Wesley13
11个月前
java集合基础复习
温故知新,好一段学习时间过后到了收割的季节。 java中集合java.util包下的一个集合根接口collection,其子接口list和set,map接口定义key-value键值对。 ArrayList、linkedlist、vector实现了list接口。也称线性集合。数据有序可重复。 ArrayList:底层实现的数组,线程不安全的,效率
Wesley13 Wesley13
11个月前
Java集合笔记
1.1 集合概述 -------- 在前面基础班我们已经学习过并使用过集合ArrayList<E> ,那么集合到底是什么呢? * **集合**:集合是java中提供的一种容器,可以用来存储多个数据。 集合和数组既然都是容器,它们有啥区别呢? * 数组的长度是固定的。集合的长度是可变的。 * 数组中存储的是同一类型的元素,可以存储基本数据类