Guava ImmutableCollection简介
前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點(diǎn)擊跳轉(zhuǎn)到教程。
ImmutableCollection代碼定義
@GwtCompatible(emulated=true) public abstract class ImmutableCollection<E> extends AbstractCollection<E> implements Serializable- ?
ImmutableCollection表示內(nèi)容不可更改的集合,并提供以下額外特性的擔(dān)保。
注意:應(yīng)當(dāng)避免直接使用ImmutableCollection作為一個(gè)類型,就如同避免直接使用Collection本身一樣。最好使用其子類(例如ImmutableSet或ImmutableList),因?yàn)樽宇悡碛懈玫腛bject.equals(java.lang.Object)?語義,可以從源頭避免常見的bug和錯(cuò)誤。
以下文檔適用于com.google.common.collect包中所有公開的不可變類型,不論是否是ImmutableCollection的子類。
保證特性
- 淺不可變:
淺不可變是指值是不可寫的,但是如果是對(duì)象的引用的值是可被改變的。不能對(duì)不可變集合的元素進(jìn)行增加、移除或者替換。這是比Collections.unmodifiableCollection?更嚴(yán)格的保證,因?yàn)檫@個(gè)集合的內(nèi)容會(huì)隨其包裝集合的改變而改變。
- 不可為Null:
本集合不能包含null元素。
- 確定性的迭代?:
元素迭代順序是被定義的,取決于集合的創(chuàng)建(細(xì)節(jié)可以參考對(duì)應(yīng)的工廠方法)。除非另外注明,集合視圖(例如ImmutableMultiset.elementSet())的迭代順序與父集合一樣。
- 線程安全:
多線程并發(fā)訪問集合是安全的。
- 完整性:
本類型不能在除com.google.common.collect包以外被繼承。(因?yàn)檫@有可能違反以上擔(dān)保特性。)
接口而非實(shí)現(xiàn)
每一個(gè)公開的類(例如ImmutableSet)都是一個(gè)提供具體功能行為保證的類型,而不僅僅是在某種特定的實(shí)現(xiàn)(例如ArrayList)。對(duì)類型名稱的含義都應(yīng)當(dāng)理解為是接口而非實(shí)現(xiàn)。
屬性類型和方法返回類型通常都應(yīng)當(dāng)使用不可變類型(例如ImmutableList)而不是一般的集合接口(例如List)。這樣便于告知調(diào)用者以上對(duì)于類型的保證特性,這是非常有用的信息。
另一方面,直接將ImmutableList作為參數(shù)類型并不令人滿意。解決方案是接受Iterable類型參數(shù),通過方法或構(gòu)造器將它傳遞給相應(yīng)的copyOf方法。
創(chuàng)建
除了邏輯層面的抽象類(例如ImmutableCollection),每個(gè)不可變類型都提供了或者此類型實(shí)例的靜態(tài)方法。最常用的有:?
1、靜態(tài)方法of,接受一個(gè)顯示的元素或條目列表。?
2、靜態(tài)方法copyOf(或者copyOfSorted),接受一個(gè)內(nèi)容可被復(fù)制的已存在的集合。?
3、嵌套的靜態(tài)類Builder,它可以用來填充一個(gè)新的不可變實(shí)例。
警告
如任何集合一樣,改變集合中的元素(這種改變影響了Object.equals(java.lang.Object)的行為)是一種錯(cuò)誤的做法。他會(huì)引起未定義的行為和bug。通常最佳實(shí)踐是完全避免使用可變對(duì)象作為集合元素,雖然許多用戶認(rèn)為不可變對(duì)象是深不可變的(deeply immutable)。
性能說明
1、集合的實(shí)現(xiàn)通常優(yōu)先考慮內(nèi)存效率,然后是訪問速度,最后是創(chuàng)建速度。?
2、copyOf方法有時(shí)會(huì)認(rèn)為沒有必要進(jìn)行實(shí)際復(fù)制操作:例如,copyOf(copyOf(anArrayList))只會(huì)復(fù)制一次。這減少了在API邊界習(xí)慣性地創(chuàng)建防御副本的代價(jià)。但是,跳過拷貝操作的精確情況是未定義的。?
3、警告:視圖集合(例如ImmutableMap.keySet或ImmutableList.subList(int,int))會(huì)保留對(duì)整個(gè)數(shù)據(jù)集合的引用,以防止其被垃圾收集。如果其中一些數(shù)據(jù)通過其他方式不再可用,這可能會(huì)產(chǎn)生內(nèi)存泄漏??赏ㄟ^傳遞視圖集合給適當(dāng)?shù)腸opyOf方法以獲得正確大小的拷貝。?
4、與創(chuàng)建可變集合并拷貝相比,使用相應(yīng)關(guān)聯(lián)的Builder類并不會(huì)降低性能,有可能會(huì)更好。?
5、通常實(shí)現(xiàn)不會(huì)緩存hash code。如果元素或鍵類型的hashCode實(shí)現(xiàn)較慢,它應(yīng)當(dāng)自己實(shí)現(xiàn)緩存。
使用示例
class Foo {private static final ImmutableSet<String> RESERVED_CODES =ImmutableSet.of("AZ", "CQ", "ZX");private final ImmutableSet<String> codes;public Foo(Iterable<String> codes) {this.codes = ImmutableSet.copyOf(codes);checkArgument(Collections.disjoint(this.codes, RESERVED_CODES));}}?
總結(jié)
以上是生活随笔為你收集整理的Guava ImmutableCollection简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sql添加Oracle数据库的表空间和用
- 下一篇: C#多线程使用进度条