集合是编程语言中的一个非常重要的特性,在
Apache的Common程序集中为我们提供了一套更为强大的
集合库。而最近火暴的
Google也推出了自己的集合库,这套集合库不仅增强了我们感兴趣的功能,而且还使整个Java集合框架得到了空前的增强。
当我第一次使用Google的集合库时就有些困惑。这套Google集合库是为增加JDK的Java集合库框架而设计的,它的开发人员计划使这套库成为JDK7的一部分。但在这之前,Apache组织已经在Common中加入了集合类库,正是由于这一点,使我不明白的是一向以创新精神著称的Google为什么要做Apache已经做过的事。不过,最后我看了下关于对这套库的创始人的采访才了解Google的最终动机是为了使这套库提供对泛型的支持,而Apache的这套集合库目前并不支持泛型,而且Apache的这套库还有一些类明显违反了Java集合框架的规范。
为了验证Apache的这套集库是否真的如Google所说的那样,我特意查看了一下Apache的这套库,结果发现它确实不支持JDK5的泛型功能(这是一个非常明显的缺陷),但在SourceForge网站上的确声称支持泛型。
至于那个违反Java集合框架规范的地方,我发现只有在Apache集合类中的Bag接口
方法违反了这个规范,这是由于Bag接口本身的特性所决定的。如在Bag接口的add方法中,在Java集合框架的规范中规定add方法必须总是返回true,但当同类型的对象在Bag中存在时,add方法并不返回true。在这种情况下,在这种情况下,它仅仅增加计数,并返回false。Apache集合类还有一个一致性
问题,我发现这套库的源程序和二进制程序有些不一致,src文件夹已经有很长时间没有更新了。
基于以上的原因,我决定更深一步地研究Google的这套
开源集合类库,并发现在其中更有价值的东西。在本文中首先描述了Google集合库的包和类(只是简单的提一下),然后会将Apache和Google的这两套集合类库进行一个比较,看看其中的差别。
Google的这套集合库共分为两个包:
1. com.google.common.base:这个包由一些常用的类组成,在些类甚至可以在没有Java集合框架来的情况下
使用。
2. com.google.common.collect:这个包所提供的类将大大增强原有的Java集合框架。
下面分别介绍一下这两个包,并将其和Apache的集合库做一下比较:
一. The com.google.common.base Package 在这部分将讨论一下在com.google.common.base中的这个通用类包。如果我们直接使用过在Java集合框架包java.lang.ref中的任何SoftReference、WeakReference或PlantomReference类,以及使用ReferenceQueue写过代码,我们会为使用Google的这套库而兴奋不已。下面是Google的三个和java.lang.ref包对应的类:
1. FinalizablePhantomReference
2 FinalizableSoftReference
3. FinalizableWeakReference
上述的三个类扩展了它们各自在Java集合类中对应的类,这些都都可以处理ReferenceQueue,并回调在这些类中定义的finalizeReferent()方法。因为如果当一个对象被垃圾回收器回收后,必须做一些清理工作时,finalizeReferent()方法将是最好的选择。
例如,假设我们正在使用ImageChunks类来将一个图象二进制数据保存在一个对象中,然后当JVM运行变得缓慢时,GC将清楚这个对象类型。我们可以试着继承这个FinalizableSoftReference类,然后覆盖FinalizeReferent方法。这个方法允许我们在GC清除对象时写一些清除操作的代码。FinalizableSoftReference的最大
优势就是我们不需要直接处理ReferenceQueue。
要注意的是,这个包并不能取代ReferenceQueue,因为它并不是为增强类而设计的。