13 年技术老兵用半首歌的时间,告诉你,Java 还有不可变 List:Immutable List

来看一下使用方法:

List list = new ArrayList<>(Arrays.asList(“沉默王二”, “沉默王三”, “沉默王四”));

List unmodifiableList = Collections.unmodifiableList(list);

我们尝试往 unmodifiableList 中添加元素“沉默王五”:

unmodifiableList.add(“沉默王五”);

运行后会抛出 UnsupportedOperationException 异常:

Exception in thread “main” java.lang.UnsupportedOperationException

at java.base/java.util.Collections$UnmodifiableCollection.add(Collections.java:1062)

at com.cmower.mkyong.immutablelist.ImmutableListDemo.main(ImmutableListDemo.java:16)

02、借助 Java 9

Java 9 的时候,List 类新增了一个 of() 静态工厂方法,可以用来创建不可变的 List。先来看一下源码:

static List of(E e1, E e2, E e3) {

return new ImmutableCollections.ListN<>(e1, e2, e3);

}

of() 方法有很多变体,比如说:

static List of(E e1) {

return new ImmutableCollections.List12<>(e1);

}

static List of(E e1, E e2) {

return new ImmutableCollections.List12<>(e1, e2);

}

static List of(E e1, E e2, E e3, E e4) {

return new ImmutableCollections.ListN<>(e1, e2, e3, e4);

}

static List of(E e1, E e2, E e3, E e4, E e5) {

return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5);

}

static List of(E e1, E e2, E e3, E e4, E e5, E e6, E e7, E e8, E e9, E e10) {

return new ImmutableCollections.ListN<>(e1, e2, e3, e4, e5,

e6, e7, e8, e9, e10);

}

该方法的设计者也挺有意思的,of() 方法的参数,从 0 到 10 都有一个相同签名的重载方法。

甚至当参数是可变的时候,使用 switch 语句对参数的个数进行了判断,然后调用不同的重载方法:

static List of(E… elements) {

switch (elements.length) { // implicit null check of elements

case 0:

@SuppressWarnings(“unchecked”)

var list = (List) ImmutableCollections.ListN.EMPTY_LIST;

return list;

case 1:

return new ImmutableCollections.List12<>(elements[0]);

case 2:

return new ImmutableCollections.List12<>(elements[0], elements[1]);

default:

return new ImmutableCollections.ListN<>(elements);

}

}

不管是 ImmutableCollections.List12 还是 ImmutableCollections.ListN,它们都是 final 的,并且继承了 AbstractImmutableList,里面的元素也是 final 的。

static final class List12 extends ImmutableCollections.AbstractImmutableList

implements Serializable {

@Stable

private final E e0;

@Stable

private final E e1;

}

static final class ListN extends ImmutableCollections.AbstractImmutableList

implements Serializable {

// EMPTY_LIST may be initialized from the CDS archive.

static @Stable List<?> EMPTY_LIST;

static {

VM.initializeFromArchive(ImmutableCollections.ListN.class);

if (EMPTY_LIST == null) {

EMPTY_LIST = new ImmutableCollections.ListN<>();

}

}

@Stable

private final E[] elements;

}

好了,来看一下使用方法吧:

final List unmodifiableList = List.of(“沉默王二”, “沉默王三”, “沉默王四”);

unmodifiableList.add(“沉默王五”);

ImmutableCollections 的内部类 ListN 或者 List12 同样不可修改,使用 add() 方法添加元素同样会在运行时抛出异常:

Exception in thread “main” java.lang.UnsupportedOperationException

at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:73)

at java.base/java.util.ImmutableCollections$AbstractImmutableCollection.add(ImmutableCollections.java:77)

at com.cmower.mkyong.immutablelist.ImmutableListDemo.main(ImmutableListDemo.java:20)

03、借助 Guava

Guava 工程包含了若干被 Google 的 Java 项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被 Google 的工程师应用在产品服务中。

在实际的项目实战当中,Guava 类库的使用频率真的蛮高的,因此我们需要在项目中先引入 Guava 的 Maven 依赖。

com.google.guava

guava

28.1-jre

Guava 定了一个 ImmutableList 类,它的声明方式如下所示:

@GwtCompatible(serializable = true, emulated = true)

@SuppressWarnings(“serial”) // we’re overriding default serialization

public abstract class ImmutableList extends ImmutableCollection

implements List, RandomAccess {

}

它的类结构关系如下所示:

java.lang.Object

↳ java.util.AbstractCollection

↳ com.google.common.collect.ImmutableCollection

↳ com.google.common.collect.ImmutableList

ImmutableList 类的 copyOf() 方法可用于创建一个不可变的 List 对象:

List list = new ArrayList<>(Arrays.asList(“沉默王二”, “沉默王三”, “沉默王四”));

List unmodifiableList = ImmutableList.copyOf(list);

unmodifiableList.add(“沉默王五”);

ImmutableList 同样不允许添加元素,add() 方法在执行的时候会抛出 UnsupportedOperationException 异常:

Exception in thread “main” java.lang.UnsupportedOperationException

at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:244)

at com.cmower.mkyong.immutablelist.ImmutableListDemo.main(ImmutableListDemo.java:25)

ImmutableList 类的 of() 方法和 Java 9 的 of() 方法类似,同样有很多相同签名的重载方法,使用方法也完全类似:

List unmodifiableList = ImmutableList.of(“沉默王二”, “沉默王三”, “沉默王四”);

ImmutableList 类还提供了 builder 模式,既可以在创建的时候添加元素,也可以基于已有的 List 创建,还可以将两者混合在一起。

ImmutableList iList = ImmutableList.builder()

.add(“沉默王二”, “沉默王三”, “沉默王四”)

.build();

List list = List.of(“沉默王二”, “沉默王三”, “沉默王四”);

ImmutableList iList = ImmutableList.builder()

.addAll(list)

.build();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Java)

复习的面试资料

这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)

  • 第一部分:Java基础-中级-高级

image

  • 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)

image

  • 第三部分:性能调优(JVM+MySQL+Tomcat)

image

  • 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)

image

  • 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)

image

  • 第六部分:其他:并发编程+设计模式+数据结构与算法+网络

image

进阶学习笔记pdf

  • Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法

image

  • Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis

image

image

image

  • Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka)

image

image

image

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

image

image

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
a架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))**

[外链图片转存中…(img-fMYZTdKv-1713788048567)]

[外链图片转存中…(img-MnIXK72o-1713788048568)]

[外链图片转存中…(img-rtI4z4Jx-1713788048569)]

  • Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)

[外链图片转存中…(img-giUTT21F-1713788048569)]

[外链图片转存中…(img-RWNGbbzd-1713788048570)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值