`

沙丁解牛之 Google Guava - List

 
阅读更多
先从List说起,Guava包中只有一种List,即【abstract class】ImmutableList,其有四个实现类:EmptyImmutableList,SingletonImmutableList,RegularImmutableList,【abstract class】ImmutableAsList,如下图(红色背景属于JDK,黄色背景属于Guava。点开大图清晰,弱问,怎么把图100%显示?):




public abstract class com.google.common.collect.ImmutableCollection:所有Immutable集合的抽象父类,不允许null元素。
顾名思义,ImmutableCollection是不可变集合,根据《Effective Java》中的原则xx,不可变有很多优点。JDK的Collections中有一系列static  unmodifiable*()方法,这些方法包装的集合也可以防止被执行修改操作,但是这种革命意志坚决不动摇是假的或者是不纯粹的,是伪装的投降主义,一个好同志要坚决抵制,例如:
@Test
public void testUnmodifiableList() {
	final List<Integer> list = new ArrayList<Integer>();
	list.add(1);
	list.add(2);
	System.out.println(list);// [1, 2]

	final List<Integer> wrapedList = Collections.unmodifiableList(list);
	System.out.println(wrapedList);// [1, 2]

	list.add(3);
	System.out.println(wrapedList);// [1, 2, 3]

	wrapedList.add(4);// throw java.lang.UnsupportedOperationException
}

我们看java.util.Collections.unmodifiableList(List<? extends T>)的源码,
        public E get(int index) {return list.get(index);}
        public E set(int index, E element) {
            throw new UnsupportedOperationException();
        }
        public void add(int index, E element) {
            throw new UnsupportedOperationException();
        }
        public E remove(int index) {
            throw new UnsupportedOperationException();
        }

该方法没做什么事情,数据结构还是原来的,只不过对原List又包装了一层而已,因此性能可能还稍微不如包装之前,因此Guava的Immutable集合诞生了,这是真正的不可变集合(实现方式也是对List接口的写操作throw new UnsupportedOperationException()),而且速度更快占用空间更小(针对空集EmptyImmutableList和单元素集合SingletonImmutableList做了优化)。

重点看RegularImmutableList,这是ImmutableList的工厂方法ImmutableList.of(...)和ImmutableList.copyOf(...)的默认产出类型。
其实也没什么,只有三个transient字段:int offset【偏移量,应该是预留的,构造函数未公开,暂时无用?】,int size【集合大小,因offset的原因size不不一定等于array的长度】,Object[] array【集合元素】
构造函数有三类:
ImmutableList.of() 
ImmutableList.of(E)
ImmutableList.of(E, E, E)
ImmutableList.of(E, E, E, E, E...)
...

ImmutableList.copyOf(E[])
ImmutableList.copyOf(Iterator<? extends E>)
ImmutableList.copyOf(Collection<? extends E>)
...

ImmutableList.builder()
...

其他的方法都很简单,如:get(),toArray(),isEmpty(),subListUnchecked(),listIterator(),equals(),toString()等

代码使用示例:
@Test
public void test() {
	// 构造of() 适用于从几个已知元素
	ImmutableList<Integer> iList = ImmutableList.of(1, 2);
	System.out.println(iList);// [1, 2]

	// copyOf() 适用于从一个已知集合or数组构造
	iList = ImmutableList.copyOf(iList);
	System.out.println(iList);// [1, 2]

	iList = ImmutableList.copyOf(new Integer[] { 1, 2, 3, 4 });
	System.out.println(iList);// [1, 2, 3, 4]

	// 单元素集合的对象是SingletonImmutableList
	iList = ImmutableList.of(6);
	System.out.println(iList);// [6]

	// 空集合的对象是静态变量EmptyImmutableList.INSTANCE
	ImmutableList<Integer> iList1 = ImmutableList.of();
	ImmutableList<Integer> iList2 = ImmutableList.of();
	System.out.println(iList1 == iList2);// true

	// builder()适用于元素不定的集合构造,但每一次add都是一次arrayCopy,效率不高
	Builder<Integer> builder = ImmutableList.builder();
	builder.add(1);
	builder.add(2, 3);
	builder.addAll(iList);

	iList = builder.build();

	System.out.println(iList);// [1, 2, 3, 6]
}


最后,总结一下。
场景:ImmutableList的使用场景,初始化一次后就只读的场景,如缓存,系统刚启动时获取的配置参数保存等。其本质就是用集合的接口使用数组。
启示:分而治之,对于空集合、单元素集合与多元素集合,分情况来处理,这样针对特殊情况的效率更高,空间更省。
命名:我之前的静态工厂方法喜欢以fromXxx()或toXxx(),instanceof()方法,以后用ofXxx(),asXxx(),construct()来命名也未尝不可。
  • 大小: 62.7 KB
分享到:
评论

相关推荐

    mongodb-sharding:沙丁堡实践学校

    在大型分布式环境中,为了处理海量数据和高并发访问,MongoDB提供了分片(Sharding)功能,这是本文将深入探讨的主题——“mongodb-sharding:沙丁堡实践学校”。 分片是将数据分散到多个物理节点上的一种策略,每个...

    html5 canvas绘制的沙丁鱼群游动的动画特效源码.zip

    本资源“html5 canvas绘制的沙丁鱼群游动的动画特效源码.zip”提供了使用Canvas API实现沙丁鱼群游动动画的示例代码。这个效果可以用于网站背景、游戏或其他需要生动视觉元素的项目。 Canvas API是HTML5的一个核心...

    数学中国网络挑战赛(认证杯)-2018挑战赛赛题-A2.pdf

    - **沙丁鱼群的行为模型**:需要构建一个数学模型来模拟沙丁鱼群在遭遇海豚捕食时的运动模式。这涉及到群体行为学和动物行为学的知识,例如鱼群如何通过集体行动降低被捕食的风险。 - **回声定位方法**:海豚利用...

    药店必备联合用药.doc

    - 风寒感冒:推荐四季感冒胶囊与桑姜感冒片或双黄连口服液配银黄胶囊,以驱寒解表。 - 风热感冒:选择桑菊感冒片加一清胶囊和阿莫西林,或者风热感冒颗粒配合清开灵和维生素C,以清热解毒。 - 流行性感冒:抗病毒...

    红珊瑚价格昂贵,该如何选购红珊瑚珠宝?.doc

    颜色越深,通常价值越高,但要注意,天使之肌(一种特殊的浅粉色)除外。例如,在阿卡珊瑚中,每提升一级颜色,价格可能会上涨15%-20%。 尺寸也是一个重要因素。红珊瑚的原始形态类似树木,自下而上逐渐变小,因此...

    正确的区分集中不同的红珊瑚

    阿卡珊瑚的显著特点是其质地如同玻璃般透明,具有微透感和晶莹的光泽,珊瑚的指纹状纹理在阿卡珊瑚表面并不明显,这也是它与其它珊瑚区别的关键特征之一。 么么珊瑚(Momo Coral),又称为"momo",其颜色跨度较大,...

    110种常见疾病的症状与关联用药方案.doc

    氨苄西林、阿奇霉素、复方虫草口服液、至灵胶囊头孢+阿奇霉素+百苓胶囊+沙丁氨醇气雾剂肺宁丸+复方虫草口服液+米诺环素维生素 C大蒜油蜂胶 胃肠道疾病 11. 胃食管反流:由于食管下端幽门括约肌失调,胃内食物不能...

    福建沿海几种鲱、 (2008年)

    研究对象包括鳓鱼、黄鲫、斑童崇、装氏小沙丁、长假棱直、黄吻棱提、赤鼻棱提、花鲸等,研究的时间跨度为2000年至2005年。 研究结果显示,福建沿海主要鱼类种群结构呈现出不同程度的小型化和低龄化趋势,同时开发...

    2089队 A题1

    位置迭代模型用于描述沙丁鱼群在稳定和非稳定状态下的运动规律。在稳定状态下,沙丁鱼遵循惯性、靠近、对齐和规避四大原则,这些原则保证了鱼群的整体协调性。当鱼群进入非稳定状态,如遭遇海豚攻击时,模型引入逃逸...

    html5 canvas绘制沙丁鱼群动画特效

    我们可以创建一个沙丁鱼类,包含位置、速度、大小等属性,并实现这些行为。然后,创建多个沙丁鱼实例并放入数组,每次更新时遍历数组并处理每个沙丁鱼的状态。 此外,为了使动画看起来更自然,可以引入随机性。比如...

    HTML5 Canvas绘制沙丁鱼群特效.zip

    3. **粒子系统**:沙丁鱼群可以视为一个简单的粒子系统,每个沙丁鱼是一个粒子,它们有自己的状态(位置、速度、大小、颜色等),通过控制这些粒子的状态变化,可以模拟出群体行为。 4. **碰撞检测**:为了让沙丁鱼...

    HTML5 canvas沙丁鱼群游动画.zip

    JavaScript代码会不断地计算每条鱼的新位置,并在Canvas上重新绘制,模拟沙丁鱼群的游动。 此外,为了增加真实感,可以考虑添加一些随机因素,比如让沙丁鱼偶尔改变方向或者对环境中的障碍物做出反应。还可以通过...

    Sql2NoSql:SQL到Nosql数据迁移器

    4. **蒙哥·沙丁(Mongo Sharding)**:MongoDB支持分片(Sharding),这是一种水平扩展策略,通过将数据分散到多个物理节点上,来提高系统的处理能力。Sql2NoSql可能包含了配置和管理MongoDB分片的功能,以适应大...

    AUTORUN(1).INF

    AUTORUN(1).INF

Global site tag (gtag.js) - Google Analytics