来看一下使用方法:
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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
光给面试题不给答案不是我的风格。这里面的面试题也只是凤毛麟角,还有答案的话会极大的增加文章的篇幅,减少文章的可读性
Java面试宝典2021版
最常见Java面试题解析(2021最新版)
2021企业Java面试题精选
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
Java面试宝典2021版
[外链图片转存中…(img-zJGkEnu7-1713036411659)]
[外链图片转存中…(img-Jpq7WHKP-1713036411659)]
最常见Java面试题解析(2021最新版)
[外链图片转存中…(img-MmvkNXDe-1713036411659)]
[外链图片转存中…(img-x7gIlM80-1713036411659)]
2021企业Java面试题精选
[外链图片转存中…(img-8CN9HXUp-1713036411660)]
[外链图片转存中…(img-QpSUINXZ-1713036411660)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!