Day18:亚季军

注意:List.of() 出现在JDK9.0以後,JDK8.0的广大用户是用不到的。

不知道看过这两个方法的人,会不会也觉得它们是同一种效果呢?

在这两个方法中我们可以放入不定长度的引数,来快速建立出一个List,而且是没办法对它操作add(), remove()的List。

List.of(1, 2, 3);
Arrays.asList(1, 2, 3);

那它们到底有没有差别?答案是有的。

Arrays.asList()方法所传回的List表面上感觉会是不可变的(immutable),但若我们传进的是一个阵列,而在其他地方对这个阵列引数做操作,那Arrays.asList()传回的List也会跟着被改变了:

int[] intArray = {1, 2, 3};
List<Integer> intList = Arrays.asList(intArray);
intList.add(4); // this will throw UnsupportedOperationException
intArray[2] = 4
System.out.println(intList); // [1, 2, 4]

这可以说是假的immutable,因为所传回的List还是改变了状态~仍然有副作用产生(Side Effect);这种在第一手操作上看似immutable的状态,称之为unmodifiable,而不会是真正的immutable。

那我们来看看List.of():

int[] intArray = {1, 2, 3};
List<Integer> intList = List.of(intArray);
intList.add(4); // this will throw UnsupportedOperationException
intArray[2] = 4
System.out.println(intList); // [1, 2, 3]

哦哦~可以看到,就算我们之後改变了引数阵列的状态,但List.of()所回传的List状态还是维持在当初回传的状态,貌似达到了真正的immutable呢!

但为什麽我们要说"貌似"呢?

很遗憾的,如果我们的阵列放的不是基本型态,而是我们自己定义的类别物件时,那当各个元素的物件状态发生改变,元素内的状态还是跟着改变;List.of()不会这麽勤劳的帮我们把各个元素都做深拷贝。

所以若要确保List.of()回传的List完完整整的是immutable,那必须也要在放入的元素类别中确保每个属性(field)也是immutable才行。


<<:  DAY19: Stream pipe()做起来!!

>>:  [day18] 追踪 & 封锁事件处理

【Day 23】Go 基础小笔记 IV:goroutine、channel

身为并发(concurrency)小能手的 Go 的重要特色 有了 channel 好像几乎不需要...

防止常见的Web攻击开发方法

概述 讨论一些应用程序常见漏洞类别: 建议 Clickjacking 发生在攻击者使用 iframe...

学习成为人体 PE Parser

看日常分享: AwesomeCS FB 看技术文章: AwesomeCS Wiki 笔者最近在阅读...

【後转前要多久】# Day30 Angular - Pipe 管道元件

管线元件 Pipe Pipe就像个小型简易的函式, 让资料从这项事情做完之後、拿处理过的资料再去做什...

使用ssh 的方式使用git

第一步:电脑生成ssh的公密匙,并存放好; 第二步:在git中打开项目之後,按下面的菜单栏,然後把共...