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
版權宣告:本文為博主原創文章,轉載請附上博文連結!
相關推薦
guava中ImmutableList使用示例詳解
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成立,則跳到這裡;否則跳到那裡”。如果閱讀由編譯器最終生成的彙編程式碼,就會
CSS3中Transition屬性詳解以及示例分享
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的詳細分析,希望對大家有所幫助!
hibernate中inverse屬性詳解
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 作用域規則告訴我們一個變量的有效範圍,它在哪兒創建,在哪兒銷毀(也就是說超出了作用域)。變量的有效作用域從它的定義點開始,到和定義變量之前最鄰近的開括號配對的第一個閉括號。也就是說,作
JavaScript中getBoundingClientRect()方法詳解
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
CSS3中REM使用詳解
前端學習 參考 瀏覽器 為什麽 pla 同時 寫法 子元素 comment 在頁面中設置字體,我們知道有常見的兩種,px 和 em. px 在Web頁面制作中,我們一般使用“px”來設置我們的文本,因為他比較穩定和精確。但是這種方法存在一個問題,當用戶在瀏覽器中瀏覽我們制作