自 Java 2 Platform 诞生以来,Java Collections Framework 一直是Java核心类库的标准组成部分。如今,会发现起了些变化,我们有了其它的选择,譬如Jakarta Commons Collections 和 Recursion Software 公司最新的Java Generic Library (JGL)。它们打破了Java Collections Framework 的垄断。(November 1, 2002)
在 Java 诞生之初,Java核心类库仅支持几种数据结构,包括数组(arrays)、向量(vectors) 和 hash tables(键-值对)。而不支持另一些重要的数据结构,比如,平衡数(balanced trees)、原始对象袋(generic bags of objects)和优先队列(priority queues),但是这些你都可以自己来构建。因而,有一些开发者在类库中加入了他们自己的数据结构。
在这篇文章中,我们将回顾一些开发者早期的尝试,他们是如何发展Sun公司的Java Collections Framework的版本,以及该框架早期的进展和在参照了用户需求之后对一些数据结构的支持。
Java Collections Frameworks 的历史
首先,让我们回顾一下初期的数据结构集合,服务于纽约州立大学(在美国的Oswego)的Doug Lea,他大概是创立了第一个被广泛应用的集合(collection)。该集合在1995年秋被发布。
那时候,一些早期的Java的开发者是由C++转变而来。他们用Standard Template Library (STL) 进行开发,创立了Java 核心类库,而该类库极其缺乏对算法和数据结构的支持。 一家来自C++和STL世界的公司(ObjectSpace)决定将STL接入Java。于是Java Generic Library (JGL) 在1996年发布,但是Sun并不喜欢这个名字。ObjectSpace公司因此将其改名为Generic Collection Library for Java,但仍旧使用JGL这一缩写。
JGL流行一时。通过营销,ObjectSpace公司使10个IDE(集成开发环境)工具提供商集成了该类库。ObjectSpace宣称它的基本用户已超过十万人。(而那时候Java开发者还远不及七位数。)事实上JGL在Java早期成了一种标准。在几次修订之后,加了一个包并且与ObjectSpace的Voyager Object Request Broker (ORB) 集成,在1997年秋JGL 3.1版发布。
随着J2SE 1.2的到来,以及它对数据结构支持的变化,Doug Lea 放弃了他的 collections包,开始使用公用类的第二个类库开发。该新包提高了对数据的同步和多线程访问。在1998年7月发布的“util.concurrent”类就提供了对锁闭(locking)、池连(pooling)和同步(concurrent)的支持。
Java Collections Framework
J2SE 1.2 是在1998年12月发布的,它包括了一组称为Java Collections Framework 的类,用来操作数据集合。对比JGL和 Collections Framework,它们有不同的目的JGL是STL的替代品,而Java Collections Framework则不是。以前的C++开发者倾向于使用JGL,那是因为JGL需要进行深入地学习,而这对于已经熟悉STL的人更为自然。JGL大约有130个类和接口,而Collections Framework约是这个的百分之二十。
JSR 166 组织于去年1月出炉,由Doug Lea 领导。该组织极力将先前提及util.concurrent 类库中的诸多高水平概念并入到Java 核心类库中。
Little 从ObjectSpace公司的亲属那得知,在J2SE 1.4版发布前一天一个叫Recursion Software 的公司宣称取得了JGL版权。后来,在2002年7月,Recursion Software 公司发布了JGL 4.0版,并将JGL集合和算法与标准的Collections Framework集成。
到了今天,我们可用的类库有:
l Collections Framework,它是Java 核心类库的一部分,且定义了对所有数据结构实现的接口。
l Jakarta Commons Collections组件,可以在Apache软件协议下自由取得。
l JGL 4.0
l 对Generic-types支持,作为原型对JSR 14 可用
l 两个非标准的类库(来自Doug Lea),由JSR 166 正在发展成标准。
让我们来看看这些类库,考虑一下何时可能会使用它们。
The Collections Framework
Collection Framework 它提供了一套核心接口,共六个:Collection, Set, List, SortedSet, Map, 和 SortedMap.
Collection 是sets和lists的基本接口。它描述了一组没有特别特征的元素。对Collection没有直接的实现,仅有子接口的实现。
Set是一个由一些项组成的集合,这些项不容许出现重复。HashSet 和 TreeSet 是两个Set 的标准实现;TreeSet 是经过分类的,它实现了SortedSet。
List接口是一个经排序的集合,提供了索引或顺序存取。List的实现包括ArrayList和LinkedList;ArrayList替代了原来的Vector类。
Map描述了‘键-值’格式的集合,类似于Hashtable。可用的maps映射有HashMap和TreeMap;TreeMap是经过分类的,它实现了SortedMap。J2SE 1.4 引入两个新的实现:LinkedHashSet和LinkedHashMap,它们内部自动维护了在增添、搜索和删除操作后的元素顺序。J2SE 1.4 中另一个实现是IdentityHashMap,它用“==”代替了“equals()”来进行等比较。对于在weak reference 感兴趣的人来说,还有一个映射 WeakHashMap,它可以把WeakReference用作键(keys),因而,如果是通过键作为值(value)的唯一引用,将会丢弃该键-值对。
在设计之初,基本框架是非线程安全的。多线程的同步访问安全性需要用一个