Java-類別庫-Guava-Immutable(不可變)集合
不可變集合,顧名思義就是說集合是不可被修改的。集合的資料項是在創建的時候提供,並且在整個生命週期中都不可改變。
為什麼要用immutable物件? immutable物件有以下的優點:
1.對不可靠的客戶程式碼庫來說,它使用安全,可以在未受信任的類別庫中安全的使用這些物件
組在物件上安全的物件多執行緒下安全,沒有競態條件
3.不需要支援變異性, 可以盡量節省空間和時間的開銷. 所有的不可變集合實作都比可變集合更有效的利用記憶體(analysis)
、44 .可以被使用為一個常數,並且期望在未來也是保持不變的
immutable對象可以很自然地用作常量,因為它們天生就是不可變的對於immutable對象的運用來說,它是一個很好的防禦編程(defensive programming)的技術實踐。
JDK中實作immutable集合
在JDK中提供了Collections.unmodifiableXXX系列方法來實現不可變集合, 在JDK中提供了Collections.unmodifiableXXX系列方法來實現不可變集合,存在一些問題,下面我們先看一個具體實例: o
.繁瑣你不得不在每個防禦性編程拷貝的地方用這個方法
3.效率低:因為它回傳的資料結構本質仍舊是原來的集合類,所以它的操作開銷,包括並發下修改檢查,hash table裡的額外資料空間都和原來的集合是一樣的。
Guava的immutable集合
Guava提供了對JDK裡標準集合類裡的immutable版本的簡單方便的實現,以及Guava自己的一些專門集合類的immutable實現。當你不希望修改一個集合類,或想做一個常數集合類別的時候,使用immutable集合類別就是一個最佳的程式設計實踐。
注意:每個Guava immutable集合類別的實作都拒絕null值。我們做過對Google內部程式碼的全面的調查,並且發現只有5%的情況下集合類別允許null值,而95%的情況下都拒絕null值。萬一你真的需要能接受null值的集合類,你可以考慮用Collections.unmodifiableXXX。
Immutable集合使用方法:
一個immutable集合可以有以下幾種方式來創建:
1.用copyOf〜譬如,, ImmutableSet.copy 1. mmutableSet.of (“a”, “b”, “c”)或ImmutableMap.of(“a”, 1, “b”, 2)
3.使用Builder類
[code]import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Test; public class ImmutableTest { @Test public void testJDKImmutable(){ List<String> list=new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); System.out.println(list); List<String> unmodifiableList=Collections.unmodifiableList(list); System.out.println(unmodifiableList); List<String> unmodifiableList1=Collections.unmodifiableList(Arrays.asList("a","b","c")); System.out.println(unmodifiableList1); String temp=unmodifiableList.get(1); System.out.println("unmodifiableList [0]:"+temp); list.add("baby"); System.out.println("list add a item after list:"+list); System.out.println("list add a item after unmodifiableList:"+unmodifiableList); unmodifiableList1.add("bb"); System.out.println("unmodifiableList add a item after list:"+unmodifiableList1); unmodifiableList.add("cc"); System.out.println("unmodifiableList add a item after list:"+unmodifiableList); } }
“b”, “c”, “a ”, “d”, “b”),對於這個集合的遍歷順序來說就是”a”, “b”, “c”, “d”。
更智能的copyOf
copyOf方法比你想像的要智能,ImmutableXXX.copyOf會在合適的情況下避免拷貝元素的操作-先忽略具體的細節,但是它的實現一般都是很“智能”的。譬如
[code][a, b, c] [a, b, c] [a, b, c] unmodifiableList [0]:b list add a item after list:[a, b, c, baby] list add a item after unmodifiableList1:[a, b, c, baby]
[code]@Test public void testGuavaImmutable(){ List<String> list=new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); System.out.println("list:"+list); ImmutableList<String> imlist=ImmutableList.copyOf(list); System.out.println("imlist:"+imlist); ImmutableList<String> imOflist=ImmutableList.of("peida","jerry","harry"); System.out.println("imOflist:"+imOflist); ImmutableSortedSet<String> imSortList=ImmutableSortedSet.of("a", "b", "c", "a", "d", "b"); System.out.println("imSortList:"+imSortList); list.add("baby"); System.out.println("list add a item after list:"+list); System.out.println("list add a item after imlist:"+imlist); ImmutableSet<Color> imColorSet = ImmutableSet.<Color>builder() .add(new Color(0, 255, 255)) .add(new Color(0, 191, 255)) .build(); System.out.println("imColorSet:"+imColorSet); }
在這段程式碼中,ImmutableList.copyOf(imSet)會智慧地回傳時間複雜度為常數的ImmutableSet的imSet.asList()。
一般來說,ImmutableXXX.copyOf(ImmutableCollection)會避免線性複雜度的拷貝操作。如在以下情況:
這個操作有可能就利用了被封裝資料結構的常數複雜度的操作。但例如ImmutableSet.copyOf(list)不能在常數複雜度下實現。
這樣不會導致記憶體洩漏-例如,你有個ImmutableList imInfolist,然後你明確操作ImmutableList.copyOf(imInfolist.subList(0, 10))。這樣的操作可以避免意外持有不再需要的在hugeList裡元素的reference。
它不會改變集合的語意-像ImmutableSet.copyOf(myImmutableSortedSet)這樣的明確拷貝操作,因為在ImmutableSet裡的hashCode()和equals()的意思和基於comparortator的ImmutableSorted是不同的。
這些特性有助於最佳化防禦性程式設計的效能開銷。
asList方法
所有的immutable集合都以asList()的形式提供了ImmutableList視圖(view)。譬如,你把資料放在ImmutableSortedSet,你就可以呼叫sortedSet.asList().get(k)來取得前k個元素的集合。
回傳的ImmutableList常常是個常數複雜度的視圖,而不是一個真的拷貝。也就是說,這個回傳集合比一般的List更聰明──譬如,它會更有效率地實作contains這樣的方法。
[code] @Test public void testAsList(){ ImmutableList<String> imList=ImmutableList.of("peida","jerry","harry","lisa","jerry"); System.out.println("imList:"+imList); ImmutableSortedSet<String> imSortList=ImmutableSortedSet.copyOf(imList); System.out.println("imSortList:"+imSortList); System.out.println("imSortList as list:"+imSortList.asList()); }
[code]imList:[peida, jerry, harry, lisa, jerry] imSortList:[harry, jerry, lisa, peida] imSortList as list:[harry, jerry, lisa, peida]
Guava集合和不可变对应关系
可变集合类型 可变集合源:JDK or Guava? 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
以上就是Java-类库-Guava-Immutable(不可变)集合的内容,更多相关内容请关注PHP中文网(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4
