Guava学习笔记Immutable不可变集合Word文件下载.docx
《Guava学习笔记Immutable不可变集合Word文件下载.docx》由会员分享,可在线阅读,更多相关《Guava学习笔记Immutable不可变集合Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。
在JDK中提供了Collections.unmodifiableXXX系列方法来实现不可变集合,但是存在一些问题,下面我们先看一个具体实例:
importjava.util.ArrayList;
importjava.util.Arrays;
importjava.util.Collections;
importjava.util.List;
importorg.junit.Test;
publicclassImmutableTest{
@Test
publicvoidtestJDKImmutable(){
Listlist=newArrayList();
list.add("
a"
);
b"
c"
System.out.println(list);
ListunmodifiableList=Collections.unmodifiableList(list);
System.out.println(unmodifiableList);
ListunmodifiableList1=Collections.unmodifiableList(Arrays.asList("
"
));
System.out.println(unmodifiableList1);
Stringtemp=unmodifiableList.get
(1);
System.out.println("
unmodifiableList[0]:
"
+temp);
baby"
listaddaitemafterlist:
+list);
listaddaitemafterunmodifiableList:
+unmodifiableList);
unmodifiableList1.add("
bb"
unmodifiableListaddaitemafterlist:
+unmodifiableList1);
unmodifiableList.add("
cc"
}
}
输出:
[a,b,c]
b
[a,b,c,baby]
listaddaitemafterunmodifiableList1:
说明:
Collections.unmodifiableList实现的不是真正的不可变集合,当原始集合修改后,不可变集合也发生变化。
不可变集合不可以修改集合数据,当强制修改时会报错,实例中的最后两个add会直接抛出不可修改的错误。
总结一下JDK的Collections.unmodifiableXXX方法实现不可变集合的一些问题:
1.它用起来笨拙繁琐你不得不在每个防御性编程拷贝的地方用这个方法
2.它不安全:
如果有对象reference原始的被封装的集合类,这些方法返回的集合也就不是正真的不可改变。
3.效率低:
因为它返回的数据结构本质仍旧是原来的集合类,所以它的操作开销,包括并发下修改检查,hashtable里的额外数据空间都和原来的集合是一样的。
Guava的immutable集合
Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava自己的一些专门集合类的immutable实现。
当你不希望修改一个集合类,或者想做一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。
注意:
每个Guava
immutable集合类的实现都拒绝null值。
我们做过对Google内部代码的全面的调查,并且发现只有5%的情况下集合类允许null值,而
95%的情况下都拒绝null值。
万一你真的需要能接受null值的集合类,你可以考虑用Collections.unmodifiableXXX。
Immutable集合使用方法:
一个immutable集合可以有以下几种方式来创建:
1.用copyOf方法,譬如,ImmutableSet.copyOf(set)
2.使用of方法,譬如,ImmutableSet.of("
"
)或者ImmutableMap.of("
1,"
2)
3.使用Builder类
实例:
@Test
publicvoidtestGuavaImmutable(){
list:
ImmutableListimlist=ImmutableList.copyOf(list);
imlist:
+imlist);
ImmutableListimOflist=ImmutableList.of("
peida"
jerry"
harry"
imOflist:
+imOflist);
ImmutableSortedSetimSortList=ImmutableSortedSet.of("
d"
imSortList:
+imSortList);
listaddaitemafterimlist:
ImmutableSetimColorSet=
ImmutableSet.builder()
.add(newColor(0,255,255))
.add(newColor(0,191,255))
.build();
imColorSet:
+imColorSet);
[peida,jerry,harry]
[a,b,c,d]
[java.awt.Color[r=0,g=255,b=255],java.awt.Color[r=0,g=191,b=255]]
对于排序的集合来说有例外,因为元素的顺序在构建集合的时候就被固定下来了。
譬如,ImmutableSet.of("
),对于这个集合的遍历顺序来说就是"
。
更智能的copyOf
copyOf方法比你想象的要智能,ImmutableXXX.copyOf会在合适的情况下避免拷贝元素的操作-先忽略具体的细节,但是它的实现一般都是很“智能”的。
譬如:
publicvoidtestCotyOf(){
ImmutableSetimSet=ImmutableSet.of("
lisa"
imSet:
+imSet);
ImmutableListimlist=ImmutableList.copyOf(imSet);
ImmutableSortedSetimSortSet=ImmutableSortedSet.copyOf(imSet);
imSortSet:
+imSortSet);
for(inti=0;
i){
list.add(i+"
x"
ImmutableListimInfolist=ImmutableList.copyOf(list.subList(2,18));
imInfolist:
+imInfolist);
intimInfolistSize=imInfolist.size();
imInfolistSize:
+imInfolistSize);
ImmutableSetimInfoSet=ImmutableSet.copyOf(imInfolist.subList(2,imInfolistSize-3));
imInfoSet:
+imInfoSet);
[peida,jerry,harry,lisa]
[harry,jerry,lisa,peida]
[0x,1x,2x,3x,4x,5x,6x,7x,8x,9x,10x,11x,12x,13x,14x,15x,16x,17x,18x,19x]
[2x,3x,4x,5x,6x,7x,8x,9x,10x,11x,12x,13x