1、在JDK中提供了Collections.unmodifiableXXX系列方法来实现不可变集合, 但是存在一些问题,下面我们先看一个具体实例:import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;import org.junit.Test;public class ImmutableTest Test public void testJDKImmutable() List list=new ArrayList(); list.add(a);bc
2、System.out.println(list); List unmodifiableList=Collections.unmodifiableList(list); System.out.println(unmodifiableList); List unmodifiableList1=Collections.unmodifiableList(Arrays.asList(,); System.out.println(unmodifiableList1); String temp=unmodifiableList.get(1); System.out.println(unmodifiableL
3、ist 0:+temp);babylist add a item after list:+list);list add a item after unmodifiableList:+unmodifiableList); unmodifiableList1.add(bbunmodifiableList add a item after list:+unmodifiableList1); unmodifiableList.add(cc 输出:a, b, cba, b, c, babylist add a item after unmodifiableList1:说明:Collections.unm
4、odifiableList实现的不是真正的不可变集合,当原始集合修改后,不可变集合也发生变化。不可变集合不可以修改集合数据,当强制修改时会报错,实例中的最后两个add会直接抛出不可修改的错误。总结一下JDK的Collections.unmodifiableXXX方法实现不可变集合的一些问题:1.它用起来笨拙繁琐你不得不在每个防御性编程拷贝的地方用这个方法2.它不安全:如果有对象reference原始的被封装的集合类,这些方法返回的集合也就不是正真的不可改变。3.效率低:因为它返回的数据结构本质仍旧是原来的集合类,所以它的操作开销,包括并发下修改检查,hash table里的额外数据空间都和原来
5、的集合是一样的。Guava的immutable集合Guava提供了对JDK里标准集合类里的immutable版本的简单方便的实现,以及Guava自己的一些专门集合类的immutable实现。当你不希望修改一个集合类,或者想做一个常量集合类的时候,使用immutable集合类就是一个最佳的编程实践。注意:每个Guavaimmutable集合类的实现都拒绝null值。我们做过对Google内部代码的全面的调查,并且发现只有5%的情况下集合类允许null值,而95%的情况下都拒绝null值。万一你真的需要能接受null值的集合类,你可以考虑用Collections.unmodifiableXXX。I
6、mmutable集合使用方法:一个immutable集合可以有以下几种方式来创建:1.用copyOf方法, 譬如, ImmutableSet.copyOf(set)2.使用of方法,譬如,ImmutableSet.of(, )或者ImmutableMap.of(, 1, , 2)3.使用Builder类实例:Test public void testGuavaImmutable()list: ImmutableList imlist=ImmutableList.copyOf(list);imlist:+imlist); ImmutableList imOflist=ImmutableList.
7、of(peidajerryharryimOflist:+imOflist); ImmutableSortedSet imSortList=ImmutableSortedSet.of(dimSortList:+imSortList);list add a item after imlist: ImmutableSet imColorSet = ImmutableSet.builder() .add(new Color(0, 255, 255) .add(new Color(0, 191, 255) .build();imColorSet:+imColorSet);peida, jerry, ha
8、rrya, b, c, djava.awt.Colorr=0,g=255,b=255, java.awt.Colorr=0,g=191,b=255对于排序的集合来说有例外,因为元素的顺序在构建集合的时候就被固定下来了。譬如,ImmutableSet.of(),对于这个集合的遍历顺序来说就是。更智能的copyOfcopyOf方法比你想象的要智能,ImmutableXXX.copyOf会在合适的情况下避免拷贝元素的操作先忽略具体的细节,但是它的实现一般都是很“智能”的。譬如: public void testCotyOf() ImmutableSet imSet=ImmutableSet.of(l
9、isaimSet:+imSet); ImmutableList imlist=ImmutableList.copyOf(imSet); ImmutableSortedSet imSortSet=ImmutableSortedSet.copyOf(imSet);imSortSet:+imSortSet); for(int i=0;i) list.add(i+x ImmutableList imInfolist=ImmutableList.copyOf(list.subList(2, 18);imInfolist:+imInfolist); int imInfolistSize=imInfolis
10、t.size();imInfolistSize:+imInfolistSize); ImmutableSet imInfoSet=ImmutableSet.copyOf(imInfolist.subList(2, imInfolistSize-3);imInfoSet:+imInfoSet);peida, jerry, harry, lisaharry, jerry, lisa, peida0x, 1x, 2x, 3x, 4x, 5x, 6x, 7x, 8x, 9x, 10x, 11x, 12x, 13x, 14x, 15x, 16x, 17x, 18x, 19x2x, 3x, 4x, 5x, 6x, 7x, 8x, 9x, 10x, 11x, 12x, 13x
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1