Guava学习笔记Immutable不可变集合Word文件下载.docx

上传人:b****2 文档编号:15383941 上传时间:2022-10-29 格式:DOCX 页数:9 大小:17.61KB
下载 相关 举报
Guava学习笔记Immutable不可变集合Word文件下载.docx_第1页
第1页 / 共9页
Guava学习笔记Immutable不可变集合Word文件下载.docx_第2页
第2页 / 共9页
Guava学习笔记Immutable不可变集合Word文件下载.docx_第3页
第3页 / 共9页
Guava学习笔记Immutable不可变集合Word文件下载.docx_第4页
第4页 / 共9页
Guava学习笔记Immutable不可变集合Word文件下载.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

Guava学习笔记Immutable不可变集合Word文件下载.docx

《Guava学习笔记Immutable不可变集合Word文件下载.docx》由会员分享,可在线阅读,更多相关《Guava学习笔记Immutable不可变集合Word文件下载.docx(9页珍藏版)》请在冰豆网上搜索。

Guava学习笔记Immutable不可变集合Word文件下载.docx

  在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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1