1. 程式人生 > >guava中ImmutableList使用示例詳解

guava中ImmutableList使用示例詳解

ImmutableList是一個不可變、執行緒安全的列表集合,它只會獲取傳入物件的一個副本,而不會影響到原來的變數或者物件,如下程式碼:

        int a = 23;
        ImmutableList<Integer> list = ImmutableList.of(a, 12);
        System.out.println(list);
        a = 232;
        System.out.println(list);
1
2
3
4
5
輸出結果:

[23, 12]
[23, 12]
1
2
ImmutableList建立不可變物件有兩種方法,一種是使用靜態of方法,另外一種是使用靜態內部類Builder。

靜態內部類構建方法 
先看下原始碼,他是一個靜態內部類,使用static和final修飾符,來輔助外部類ImmutableList構建不可變的集合物件
  public static final class Builder<E>
     extends ImmutableCollection.Builder<E>
   {
     private Object[] contents;
     private int size;
     public Builder()
     {
       this(4);
     }
     Builder(int capacity)
     {
       this.contents = new Object[capacity];
       this.size = 0;
     }

     Builder<E> ensureCapacity(int minCapacity)
     {
       if (this.contents.length < minCapacity) {
         this.contents = ObjectArrays.arraysCopyOf(this.contents, expandedCapacity(this.contents.length, minCapacity));
       }

       return this;
     }
     public Builder<E> add(E element)
     {
       Preconditions.checkNotNull(element);
       ensureCapacity(this.size + 1);
       this.contents[(this.size++)] = element;
       return this;
     }

     public Builder<E> addAll(Iterable<? extends E> elements)
     {
       if ((elements instanceof Collection)) {
         Collection<?> collection = (Collection)elements;
         ensureCapacity(this.size + collection.size());
       }
       super.addAll(elements);
       return this;
     }
     public Builder<E> add(E... elements)
     {
       for (int i = 0; i < elements.length; i++) {
         ObjectArrays.checkElementNotNull(elements[i], i);
       }
       ensureCapacity(this.size + elements.length);
       System.arraycopy(elements, 0, this.contents, this.size, elements.length);
       this.size += elements.length;
       return this;
     }
     public Builder<E> addAll(Iterator<? extends E> elements)
     {
       super.addAll(elements);
       return this;
     }
     public ImmutableList<E> build()
     {
       switch (this.size) {
       case 0: 
         return ImmutableList.of();

       case 1: 
         E singleElement = this.contents[0];
         return ImmutableList.of(singleElement);
       }
       if (this.size == this.contents.length)
       {
         return new RegularImmutableList(this.contents);
       }
       return new RegularImmutableList(ObjectArrays.arraysCopyOf(this.contents, this.size));
     }
   }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
使用的具體示例:

        //使用內部類的方式
        ImmutableList<Integer> list = ImmutableList .<Integer>builder()
                                                        .add(12)
                                                        .add(23)
                                                        .add(34)
                                                        .build();
1
2
3
4
5
6
靜態方法 
靜態方法提供了多個引數的of靜態方法
        //獲取一個空的不可變集合物件
        ImmutableList<String> list1 = ImmutableList .<String>of();
        //獲取一個有一個元素的不可變集合物件
        ImmutableList<String> list2 = ImmutableList .<String>of("12");
        //獲取一個有兩個元素的不可變集合物件
        ImmutableList<String> list3 = ImmutableList .<String>of("12","23");
1
2
3
4
5
6
複製陣列中的元素到ImmutableList中
        List<String> list4 = new ArrayList<String>();
        list4.add("1");
        list4.add("2");
        list4.add("3");
        //copy陣列list4的一個副本
        List<String> list5 = ImmutableList .<String>copyOf(list4);
--------------------- 
作者:隨風yy 
來源:CSDN 
原文:https://blog.csdn.net/yaomingyang/article/details/80903780 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關推薦

guavaImmutableList使用示例

ImmutableList是一個不可變、執行緒安全的列表集合,它只會獲取傳入物件的一個副本,而不會影響到原來的變數或者物件,如下程式碼:         int a = 23;         ImmutableList<Integer> list = Immu

VS2010 Chart控件(一)Chart控件在ASP.NET網站的應用示例(C#語言)

[1] 設置 cti write conf int 應用程序 itl config 步驟如下: 1、 Chart控件(一)Chart控件在ASP.NET網站中的應用示例詳解(C#語言)" title="VS2010 Chart控件(一)Chart控件在ASP.NET網站中的

C++的虛表(vtable)和虛指標(vptr)示例

1、每個有virtual函式的c++類都有一個vtable,每個類物件都有個vtable的vptr; 2、在vc中,類的繼承是在基類後面追加資料的形式進行繼承的。 測試程式碼如下(在32位系統下的vs2008環境中測試的): class Test { publi

socket的短連線與長連線,心跳包示例

原文地址:http://blog.csdn.net/fireroll/article/details/9043221 TCP連線簡介當網路通訊時採用TCP協議時,在真正的讀寫操作之前,server與client之間必須建立一個連線,當讀寫操作完成後,雙方不再需要這個連線時它

Java break和continue結合標籤標示符中斷迴圈示例(附原始碼)

臭名昭著的goto        程式語言中一開始就有goto關鍵詞了。事實上,goto起源於組合語言的程式控制:“若條件A成立,則跳到這裡;否則跳到那裡”。如果閱讀由編譯器最終生成的彙編程式碼,就會

CSS3Transition屬性以及示例分享

1、transition-property的語法[css] transition-property :all(所有屬性改變) || [attr] (指定要運動的樣式)|| none(沒有屬性改變)   2、transition-property的屬性值   (1)

socket程式設計的超時設定示例之一

簡介:在網路通訊中,如果socket處於阻塞模式執行時,就需要考慮處理socket操作超時的問題。所謂阻塞模式,是指其完成指定的操作之前阻塞當前的程序或執行緒,直到操作有結果返回.在我們直接呼叫socket操作函式時,如果不進行特意宣告的話,它們都是工作在阻塞模式的,如 c

c/c++define用法及程式碼示例

c++中define用法 define在c++語言中用法比較多,這裡對其進行整理。 1.無參巨集定義 無參巨集的巨集名後不帶引數。 其定義的一般形式為: #define 識別符號 字串 其中的“#”表示這是一條預處理命令。凡是以“#”開頭的均為預

C/C++extern關鍵字

編譯器 fin 生成 接口 bcd 只需要 c++環境 結束 編程 轉自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html 1 基本解釋:extern可以置於變量或者函數前,以標示變量或者

js的attribute

介紹 特點 奇怪 使用方式 get inner () input 關於 Attribute是屬性的意思,文章僅對部分兼容IE和FF的Attribute相關的介紹。 attributes:獲取一個屬性作為對象 getAttribute:獲取某一個屬性的值setAttribu

【JavaScript的this

定律 htm uid js代碼 tdd ati tom dmr doctype 前言 this用法說難不難,有時候函數調用時,往往會搞不清楚this指向誰?那麽,關於this的用法,你知道多少呢? 下面我來給大家整理一下關於this的詳細分析,希望對大家有所幫助!

hibernateinverse屬性

values 性能 update 關聯 維護 value str true 詳解 術語”inverse”直譯為”反轉”。在Hibernate中,inverse屬性指定了關聯關系中的方向。關聯關系中,inverse=“false”的為主動方,由主動方維護關聯關系。在一對多關聯

hibernate cascade屬性

-m hibernate 發現 執行效率 pda 不一定 () 程序執行效率 刪除 配置關聯時,我們考慮兩點:程序執行效率和實際業務需要,前面的例子中無論是單向的關聯還是雙向的關聯,我們都要分別對實體類使用session.save()才能將數據保存至數據庫。問題:如果

JS的showModelDialog和實例

cti 信息 創建 字符 非模態窗口 tle cin dialog ima 1.<a href="#" onclick="SeePic(‘${list.PATH}‘)"><font color="blue">預覽</font></a

Eclipse的BuildPath【轉載】

sdn libraries 依賴 源代碼 title 打開 低版本 代碼 功能 什麽是Build Path? Build Path是指定Java工程所包含的資源屬性集合。 在一個成熟的Java工程中,不僅僅有自己編寫的源代碼,還需要引用系統運行庫(JRE)、第三方的功能擴展

C/C++作用域(轉)

防止 局部作用域 gist 文件中 方式 為什麽不使用 形式參數 lan archive 作用域規則告訴我們一個變量的有效範圍,它在哪兒創建,在哪兒銷毀(也就是說超出了作用域)。變量的有效作用域從它的定義點開始,到和定義變量之前最鄰近的開括號配對的第一個閉括號。也就是說,作

JavaScriptgetBoundingClientRect()方法

script otto java chrome 頁面 支持 urn client fire getBoundingClientRect() 這個方法返回一個矩形對象,包含四個屬性:left、top、right和bottom。分別表示元素各邊與頁面上邊和左邊的距離。

c#使用多線程的幾種方式示例

請求 rgs result類型 creat 方法的參數 通過 net 完成 turn (1)不需要傳遞參數,也不需要返回參數 ThreadStart是一個委托,這個委托的定義為void ThreadStart(),沒有參數與返回值。 class Program { sta

WebService的WSDL 及jmeter測試

images 包括 3.2 接口測試工具 types 通知 操作 sdl message 首先簡單講解一下什麽是wsdl. 一個WSDL文檔通常包含8個重要的元素,即definitions、types、import、message、portType、ope

CSS3REM使用

前端學習 參考 瀏覽器 為什麽 pla 同時 寫法 子元素 comment 在頁面中設置字體,我們知道有常見的兩種,px 和 em. px 在Web頁面制作中,我們一般使用“px”來設置我們的文本,因為他比較穩定和精確。但是這種方法存在一個問題,當用戶在瀏覽器中瀏覽我們制作