注意: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才行。
身为并发(concurrency)小能手的 Go 的重要特色 有了 channel 好像几乎不需要...
概述 讨论一些应用程序常见漏洞类别: 建议 Clickjacking 发生在攻击者使用 iframe...
看日常分享: AwesomeCS FB 看技术文章: AwesomeCS Wiki 笔者最近在阅读...
管线元件 Pipe Pipe就像个小型简易的函式, 让资料从这项事情做完之後、拿处理过的资料再去做什...
第一步:电脑生成ssh的公密匙,并存放好; 第二步:在git中打开项目之後,按下面的菜单栏,然後把共...