Guava ImmutableCollection簡介

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

ImmutableCollection代碼定義

@GwtCompatible(emulated=true)
public abstract class ImmutableCollection<E> extends AbstractCollection<E> implements Serializable
  • ?

ImmutableCollection表示內容不可更改的集合,并提供以下額外特性的擔保。

注意:應當避免直接使用ImmutableCollection作為一個類型,就如同避免直接使用Collection本身一樣。最好使用其子類(例如ImmutableSet或ImmutableList),因為子類擁有更好的Object.equals(java.lang.Object)?語義,可以從源頭避免常見的bug和錯誤。

以下文檔適用于com.google.common.collect包中所有公開的不可變類型,不論是否是ImmutableCollection的子類。

保證特性

  • 淺不可變

淺不可變是指值是不可寫的,但是如果是對象的引用的值是可被改變的。不能對不可變集合的元素進行增加、移除或者替換。這是比Collections.unmodifiableCollection?更嚴格的保證,因為這個集合的內容會隨其包裝集合的改變而改變。

  • 不可為Null

本集合不能包含null元素。

  • 確定性的迭代?

元素迭代順序是被定義的,取決于集合的創建(細節可以參考對應的工廠方法)。除非另外注明,集合視圖(例如ImmutableMultiset.elementSet())的迭代順序與父集合一樣。

  • 線程安全

多線程并發訪問集合是安全的。

  • 完整性

本類型不能在除com.google.common.collect包以外被繼承。(因為這有可能違反以上擔保特性。)

接口而非實現

每一個公開的類(例如ImmutableSet)都是一個提供具體功能行為保證的類型,而不僅僅是在某種特定的實現(例如ArrayList)。對類型名稱的含義都應當理解為是接口而非實現。

屬性類型和方法返回類型通常都應當使用不可變類型(例如ImmutableList)而不是一般的集合接口(例如List)。這樣便于告知調用者以上對于類型的保證特性,這是非常有用的信息。

另一方面,直接將ImmutableList作為參數類型并不令人滿意。解決方案是接受Iterable類型參數,通過方法或構造器將它傳遞給相應的copyOf方法。

創建

除了邏輯層面的抽象類(例如ImmutableCollection),每個不可變類型都提供了或者此類型實例的靜態方法。最常用的有:?
1、靜態方法of,接受一個顯示的元素或條目列表。?
2、靜態方法copyOf(或者copyOfSorted),接受一個內容可被復制的已存在的集合。?
3、嵌套的靜態類Builder,它可以用來填充一個新的不可變實例。

警告

如任何集合一樣,改變集合中的元素(這種改變影響了Object.equals(java.lang.Object)的行為)是一種錯誤的做法。他會引起未定義的行為和bug。通常最佳實踐是完全避免使用可變對象作為集合元素,雖然許多用戶認為不可變對象是深不可變的(deeply immutable)。

性能說明

1、集合的實現通常優先考慮內存效率,然后是訪問速度,最后是創建速度。?
2、copyOf方法有時會認為沒有必要進行實際復制操作:例如,copyOf(copyOf(anArrayList))只會復制一次。這減少了在API邊界習慣性地創建防御副本的代價。但是,跳過拷貝操作的精確情況是未定義的。?
3、警告:視圖集合(例如ImmutableMap.keySet或ImmutableList.subList(int,int))會保留對整個數據集合的引用,以防止其被垃圾收集。如果其中一些數據通過其他方式不再可用,這可能會產生內存泄漏。可通過傳遞視圖集合給適當的copyOf方法以獲得正確大小的拷貝。?
4、與創建可變集合并拷貝相比,使用相應關聯的Builder類并不會降低性能,有可能會更好。?
5、通常實現不會緩存hash code。如果元素或鍵類型的hashCode實現較慢,它應當自己實現緩存。

使用示例

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));}}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450015.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450015.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450015.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Todo List

fragment里面如何處理back按鍵事件。 fragment里面無法Override onBackPressed接口&#xff0c;如何優雅的處理back press事件&#xff1f;activity如何獲取當前活躍的fragment對象。異步網絡請求如何改造成rxjava&#xff0c;rxjava有設置運行線程的能力&#xff0c;異步請求…

常見的幾種負載均衡算法

1、輪詢將所有請求&#xff0c;依次分發到每臺服務器上&#xff0c;適合服務器硬件相同的場景。優點&#xff1a;服務器請求數目相同&#xff1b; 缺點&#xff1a;服務器壓力不一樣&#xff0c;不適合服務器配置不同的情況&#xff1b; 2、隨機請求隨機分配到各臺服務器上。優…

基于 Token 的身份驗證方法

基于 Token 的身份驗證方法 使用基于 Token 的身份驗證方法&#xff0c;在服務端不需要存儲用戶的登錄記錄。大概的流程是這樣的&#xff1a;客戶端使用用戶名跟密碼請求登錄 服務端收到請求&#xff0c;去驗證用戶名與密碼 驗證成功后&#xff0c;服務端會簽發一個 Token&…

Android應用開發-圖片加載庫Glide

Glide Picasso和Glide之間的區別&#xff1a; Picasso 僅僅緩存了全尺寸的圖像&#xff1b;然而 Glide 緩存了原始圖像&#xff0c;全分辨率圖像和另外小版本的圖像。

excel 表格導入 - java 實現

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; imp…

C語言 API

MySQL的C語言API接口 1、首先當然是連接數據庫&#xff0c;函數原型如下&#xff1a; MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned…

線程組之間的JMeter傳遞變量

下面&#xff0c;我們將看看如何在線程組之間共享和傳遞變量。在開發高級JMeter腳本時&#xff0c;很可能您將擁有多個線程組。每個線程組將執行不同的請求。一個很好的例子是我們需要使用Bearer Tokens對用戶進行身份驗證。一個線程組執行身份驗證并保存令牌。另一個線程組需要…

python第九天(9-33)

一&#xff1a;進程 進程概念 進程就是一個程序運行在一個數據集上的一次動態執行過程進程一般由程序&#xff0c;數據集&#xff0c;進程控制塊組成進程控制塊&#xff1a; 進程控制塊用來記錄進程的外部特征&#xff0c;描述進程的執行變化過程&#xff0c;系統可以利用它來控…

Android Studio出現Failed to open zip file. Gradle's dependency cache may be corrupt問題的解決

刪除了/Users/tycao/.gradle/wrapper/dists目錄下對應的gradle-X.X-all目錄重新sync了

雙機熱備份和負載均衡的區別

1、雙機熱備相當于2臺服務器其中有一臺是另一臺的備機&#xff0c;也可以互為備機&#xff1b;而且這兩臺主機的數據時實時同步的&#xff1b;主機在運行服務時&#xff0c;備機處于檢測狀態&#xff0c;主機發生故障后&#xff0c;備機將接管主機的服務。2、負載均衡是在這2臺…

Python 數據類型--Bytes類型

一、Bytes類型 在Python3以后&#xff0c;字符串和bytes類型徹底分開了。字符串是以字符為單位進行處理的&#xff0c;bytes類型是以字節為單位處理的。 bytes數據類型在所有的操作和使用甚至內置方法上和字符串數據類型基本一樣&#xff0c;也是不可變的序列對象。 bytes對象只…

Android應用開發-onNewIntent()

轉載自Android中 activity 的onNewIntent函數

文件結構

C語言文件名命名的規則 1、文件標識符分為兩部分&#xff0c;即文件名前綴和后綴。文件名前綴的最前面要使用范圍限定符——模塊名&#xff08;文件名&#xff09;縮寫。 2、采用小寫字母命名文件&#xff0c;避免使用一些比較通俗的文件名&#xff0c;如&#xff1a;publi…

POJ 1187 隕石的秘密 (線性DP)

題意&#xff1a; 公元11380年&#xff0c;一顆巨大的隕石墜落在南極。于是&#xff0c;災難降臨了&#xff0c;地球上出現了一系列反常的現象。當人們焦急萬分的時候&#xff0c;一支中國科學家組成的南極考察隊趕到了出事地點。經過一番偵察&#xff0c;科學家們發現隕石上刻…

bzoj2561 最小生成樹

題意&#xff1a;給你無向圖&#xff0c;給定一條邊&#xff0c;求至少在原圖中刪去多少邊才能使它同時在某個最大生成樹和某個最小生成樹中。 解&#xff1a; 假裝我們把邊排序了&#xff0c;然后把所有邊權小于給定邊的邊都加進去了。 那么我們要刪的就是s到t的一個割。 最大…

Android應用開發—onSaveInstanceState方法什么時候被調用?

轉載自onSaveInstanceState方法什么時候被調用?&#xff08;轉載/整理&#xff09; 在 Activity 被銷毀之前被調用來保存每個實例的狀態&#xff0c;這樣就可以保證該狀態能夠從 onCreate(Bundle) 或者onRestoreInstanceState(Bundle)恢復過來。 本方法在 Activity 可能被銷毀…

記一次phpstudy重啟后Apache無法啟動

相信大家都碰到過phpstudy中Apache無法啟動的情況1、首先檢查80端口是否占用&#xff0c;有的話就管理2、檢查是否缺少vc9運行文件如果上述兩種方法還不能解決問題就進入安裝目錄中Apache的bin目錄下&#xff0c;在命令行窗口中執行httpd.exe&#xff0c;看看是否報錯。我就是在…

C#任務調度——LimitedConcurrencyLevelTaskScheduler

這是參考大佬分享的代碼寫的有問題請提出指正&#xff0c;謝謝。using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks;namespace TaskManager {class TaskFactoryMa…

同步本地遠程分支 git remote prune origin

git remote prune origin &#xff08;不常用總忘記&#xff0c;記錄下&#xff09;

264 參考幀 list0 list1

作了這么久的h264工作&#xff0c;這部分還一直從未去深入了解過&#xff0c;真是不求甚解啊&#xff0c;那幫老外的代碼也寫得太全了&#xff0c;該部分至今天才開始研究 首先參考幀這里關注的是兩種&#xff0c;p ,b ,前向參考和后向參考 由白皮書中看到&#xff0c;p幀的參…