成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

跟著 Guava 學 Java 之 不可變集合

開發 后端
不可變集合,英文叫 immutable,顧名思義就是說集合是不可被修改的。集合的數據項是在創建的時候提供,并且在整個生命周期中都不可改變。

什么是不可變集合

不可變集合,英文叫 immutable,顧名思義就是說集合是不可被修改的。集合的數據項是在創建的時候提供,并且在整個生命周期中都不可改變。

為什么要用不可變集合?

第一:防御性編程需要

我有一個集合,你拿來使用,鬼知道你會不會亂搞,往集合里添加不合適的元素,或者隨便刪除元素,我不放心,對,就是不信你,我的集合我做主,給你個不可變的吧,這樣你就不可能亂搞我的集合了,我就放心了,不擔心你的操作給我帶來風險 。官方解釋:防御,defensive programming,聽起來高級不?

第二:線程安全

沒有買賣就沒有殺害!

集合是不可變的,不讓你有變化,不可能有變化。沒有變化,就沒有競態條件,多少個線程來都是一個樣,安全,就是***安全。

第三:節省開銷

不需要支持可變性,可以盡量節省空間和時間的開銷, 所有的不可變集合實現都比可變集合更加有效的利用內存。

JDK9 之前的實現

Collections提供了一組方法把可變集合封裝成不可變集合:

圖片

但這玩意兒有問題,舉個例子:

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

List<String> unmodifiableList = Collections.unmodifiableList(list);
list.add("d");
System.out.println(unmodifiableList);

這個輸出的結果居然是 [a,b,c,d]。

what ? 這不就變了嗎,我要的是不可變集合啊,這坑爹的玩意兒。有兄弟說了,那我切斷 list 的引用是不就行了?

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

List<String> unmodifiableList = Collections.unmodifiableList(list);
list.add("d");
list = null;
System.out.println(unmodifiableList);

呵呵,不行,輸出仍然是  [a,b,c,d]  果然坑爹,而且你發現沒有,編碼也比較麻煩,還得用 Collections 間接轉一下。

Collections.unmodifiableList 實現的不是真正的不可變集合,當原始集合修改后,不可變集合也發生變化。此外,它返回的數據結構本質仍舊是原來的集合類,所以它的操作開銷,包括并發下修改檢查,hash table 里的額外數據空間都和原來的集合是一樣的。

由于這些問題,JDK9 出了些新的生成不可變集合的方法,比如:

  • List.of
  • Set.of
  • Map.of
  • ......

確實可以直接生成不可變集合,編碼也比較方便了:

List<String> immutableList= List.of("a", "b", "c");

如果你要修改集合會拋出異常 java.lang.UnsupportedOperationException:

immutableList.add("d");

but;

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

List<List<String>> list1 = List.of(list);
list.add("d");
System.out.println(list1);

上面代碼的輸出仍然是 : [a,b,c,d];

當然我們不是說人家 api 是錯的,人家就是這么設計的(愛信不信),可我感覺不爽,如果不小心可能會犯錯,本來是防御性編程,搞不好干成跑路性編程了。

再次強調,不是說人家 JDK 設計錯了,人家就是這么設計的,你的明白?當然不爽的還有 google 的工程師們,所以我們下面介紹下拿起鍵盤自己解決問題的 google 工程師們寫的 guava 是怎么解決問題的。

Guava

來,我們接著上面的那個例子,直接寫個 Guava 版本的你自己體會下:

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

ImmutableList<String> strings = ImmutableList.copyOf(list);
list.add("d");

System.out.println(strings);

輸出終于如我所愿的是 : [a,b,c] 了。

無論是從命名、語義、結果、代碼可讀性是不是都比 JDK 版本的好很多?這樣的代碼讓我感覺世界又美好了一些。

美好的東西都想擁有,但問題來了, Guava 針對哪些集合提供了哪些對應的不可變集合類呢,這里我們給大家整理了一下:

可變集合接口

屬于 JDK 還是 Guava

不可變版本

Collection

JDK

ImmutableCollection

List

JDK

ImmutableList

Set

JDK

ImmutableSet

SortedSet/NavigableSet

JDK

ImmutableSortedSet

Map

JDK

ImmutableMap

SortedMap

JDK

ImmutableSortedMap

Multiset

Guava

ImmutableMultiset

SortedMultiset

Guava

ImmutableSortedMultiset

Multimap

Guava

ImmutableMultimap

ListMultimap

Guava

ImmutableListMultimap

SetMultimap

Guava

ImmutableSetMultimap

BiMap

Guava

ImmutableBiMap

ClassToInstanceMap

Guava

ImmutableClassToInstanceMap

Table

Guava

ImmutableTable

介紹幾個方法:

  • of 方法,用法是一脈相承的,就是構建集合用的
  • copyOf ,上面例子中出現過,官方文檔上說它是智能的,比如它可以判斷參數是不是一個 immutable 對象,這樣可以避免做拷貝

JDK10

List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");

List<String> strings = List.copyOf(list);

list.add("d");
System.out.println(strings);

以上代碼在 JDK10 以上版本輸出  :[a,b,c],主要是因為 copyOf 方法是 10 以上版本才有的。

你看,JDK 也一直在進步,所以如果你用的是 JDK10 以及上版本,是不是要用 Guava 在這個具體功能點上就是可選的了。

最后

整體對比起來,我的個人感覺是在不可變集合的操作上 Guava 的 API 更好用一些,當然庫的使用因人而異,用 JDK 原生的也沒毛病,畢竟依賴更少,學習成本也小。

我們總說要改革、要進步,而真正的改革往往都不是自上而下的,很多都是自下而上的被推動著前進 ,如果沒有 Guava,沒有開源社區的很多優秀的庫和組件,JDK 會不會把這些優秀的建議吸取進來?我不知道,但至少 JAVA 也一直在進步,也希望它越來越好。

責任編輯:武曉燕 來源: 小盒子的技術分享
相關推薦

2022-02-09 07:52:36

GolangGo語言

2023-10-20 08:18:17

Python數據類型

2022-08-19 19:02:20

開源鴻蒙操作系統

2023-06-07 19:17:14

UbuntuKDELinux

2022-09-21 08:16:18

緩存框架

2024-02-26 10:47:09

Python數據類型開發

2024-04-08 07:58:11

Python數據類型字符串

2010-01-14 14:30:09

VB.NET匿名類型

2022-06-28 09:10:32

K8S容器鏡像滾動升級

2015-10-12 08:56:27

Java不可變

2015-03-19 15:04:06

2017-04-02 09:30:15

機器人駕校機器人教學

2023-02-18 13:47:04

CoreOS容器操作系統云原生

2021-06-14 09:34:23

對象存儲存儲

2022-02-07 10:21:54

.NET配置對象

2020-03-09 10:21:12

Java集合類 Guava

2022-08-29 17:25:19

鴻蒙應用開發

2025-02-08 13:23:27

JavaScript開發喚醒鎖

2021-04-07 17:06:55

String Final存儲

2024-09-24 08:36:18

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人免费视频网站高清观看视频 | 国产精品久久久久久久岛一牛影视 | 午夜国产精品视频 | 中文字幕在线观看一区 | 九九国产| 国产成在线观看免费视频 | 99pao成人国产永久免费视频 | 欧美精品video | 日韩在线成人 | 观看av| 日本精品一区二区在线观看 | 在线一区二区三区 | 亚洲成人精品一区 | 伊人超碰 | 国产情侣一区 | 99精品久久99久久久久 | 成人精品一区二区三区四区 | 久草视频在线播放 | 久久久久久国产 | 亚洲精品久久久一区二区三区 | 在线精品一区二区 | 久久久久久久av | 精品久久精品 | 国产精品亚洲成在人线 | 天天干视频网 | 亚洲精品国产a久久久久久 午夜影院网站 | 久久av一区二区三区 | 性福视频在线观看 | 成人黄色a| 91免费在线视频 | 久久久91精品国产一区二区三区 | 亚洲av毛片成人精品 | 又爽又黄axxx片免费观看 | 午夜免费福利电影 | 艹逼网 | 成人高清在线视频 | 国产精品自拍啪啪 | 日日夜夜精品视频 | av网站在线播放 | 在线观看欧美日韩视频 | 成人国产一区二区三区精品麻豆 |