J2SE
java.util包中包含了一些在Java 2中新增加的最令人兴奋的增强功能:类集。一个类集(collection)是一组对象。类集的增加使得许多java.util中的成员在结构和体系结构上发生根本的改变。它也扩展了包可以被应用的任务范围。类集是被所有Java程序员紧密关注的最新型的技术。 除了类集,java.util还包含了支持范围广泛的函数的各种各样的类和接口。这些类和接口被核心的Java包广泛使用,同时当然也可以被你编写的程序所使用。对它们的应用包括产生伪随机数,对日期和时间的操作,观测事件,对位集的操作以及标记字符串。由于java.util具有许多特性,因此它是Java中最被广泛使用的一个包。 java.util中包含的类如下。 在Java 2中新增加的一些也被列出: AbstractCollection (Java 2) EventObject Random AbstractList (Java 2) GregorianCalendar ResourceBundle AbstractMap (Java 2) HashMap (Java 2) SimpleTimeZone AbstractSequentialList (Java 2) HashSet (Java 2) Stack AbstractSet (Java 2) Hashtable StringTokenizer ArrayList (Java 2) LinkedList (Java 2) Timer (Java 2, v1.3) Arrays (Java 2) ListResourceBundle TimerTask (Java 2, v1.3) BitSet Locale TimeZone Calendar Observable TreeMap (Java 2) Collections (Java 2) Properties TreeSet (Java 2) Date PropertyPermission (Java 2) Vector Dictionary PropertyResourceBundle WeakHashMap (Java 2) java.util定义了如下的接口。注意其中大多数是在Java 2中新增加的。 Collection (Java 2) List (Java 2) Observer Comparator (Java 2) ListIterator (Java 2) Set (Java 2) Enumeration Map (Java 2) SortedMap (Java 2) EventListener Map.Entry (Java 2) SortedSet (Java 2) Iterator (Java 2) ResourceBundle类,ListResourceBundle类和PropertyResourceBundle类帮助具有特定地区资源的大型程序国际化。关于这些类的讨论,在这里从略。授权对系统属性进行读/写的PropertyPermission类也超过了本书的讨论范围。EventObject和EventListener类将在第20章讨论。下面将对剩下的类和接口做详细的讨论。 15.1 类集概述 Java的类集(Collection)框架使你的程序处理对象组的方法标准化。在Java 2出现之前,Java提供了一些专门的类如Dictionary,Vector,Stack和Properties去存储和操作对象组。尽管这些类非常有用,它们却缺少一个集中,统一的主题。因此例如说使用Vector的方法就会与使用Properties的方法不同。以前的专门的方法也没有被设计成易于扩展和能适应新的环境的形式。而类集解决了这些(以及其他的一些)问题。 类集框架被设计用于适应几个目的。 首先,这种框架是高性能的。对基本类集(动态数组,链接表,树和散列表)的实现是高效率的。一般很少需要人工去对这些“数据引擎”编写代码(如果有的话)。第二点,框架必须允许不同类型的类集以相同的方式和高度互操作方式工作。第三点,类集必须是容易扩展和/或修改的。为了实现这一目标,类集框架被设计成包含一组标准的接口。对这些接口,提供了几个标准的实现工具(例如LinkedList,HashSet和TreeSet),通常就是这样使用的。如果你愿意的话,也可以实现你自己的类集。 为了方便起见,创建用于各种特殊目的的实现工具。一部分工具可以使你自己的类集实现更加容易。最后,增加了允许将标准数组融合到类集框架中的机制。 算法(Algorithms)是类集机制的另一个重要部分。算法操作类集,它在Collections类中被定义为静态方法。因此它们可以被所有的类集所利用。每一个类集类不必实现它自己的方案,算法提供了一个处理类集的标准方法。 由类集框架创建的另一项是Iterator接口。一个迭代程序(iterator)提供了一个多用途的,标准化的方法,用于每次访问类集的一个元素。因此迭代程序提供了一种枚举类集内容(enumerating the contents of a collection)的方法。因为每一个类集都实现Iterator,所以通过由Iterator定义的方法,任一类集类的元素都能被访问到。因此,稍作修改,循环通过集合的程序代码也可以被用来循环通过列表。 除了类集之外,框架定义了几个映射接口和类。映射(Maps)存储键/值对。尽管映射在对项的正确使用上不是“类集”,但它们完全用类集集成。在类集框架的语言中,可以获得映射的类集“视图”(collection-view)。这个“视图”包含了从存储在类集中的映射得到的元素。因此,如果选择了一个映射,就可以将其当做一个类集来处理。 对于由java.util定义的原始类,类集机制被更新以便它们也能够集成到新的系统里。所以理解下面的说法是很重要的:尽管类集的增加改变了许多原始工具类的结构,但它却不会导致被抛弃。类集仅仅是提供了处理事情的一个更好的方法。 最后的一点:如果你对C++比较熟悉的话,那么你可以发现Java的类集技术与在C++中定义的标准模板库(STL)相似。在C++中叫做容器(container),而在Java中叫做类集。 15.2 类集接口 类集框架定义了几个接口。本节对每一个接口都进行了概述。首先讨论类集接口是因为它们决定了collection类的基本特性。不同的是,具体类仅仅是提供了标准接口的不同实现。支持类集的接口总结在如下的表中: 接口描述 Collection 能使你操作对象组,它位于类集层次结构的顶层 List 扩展Collection去处理序列(对象的列表) Set 扩展Collection去处理集合,集合必须包含唯一元素 SortedSet 扩展Set去处理排序集合 除了类集接口之外,类集也使用Comparator,Iterator和ListIterator接口。关于这些接口将在本章后面做更深入的描述。简单地说,Comparator接口定义了两个对象如何比较; Iterator和ListIterator接口枚举类集中的对象。 为了在它们的使用中提供最大的灵活性,类集接口允许对一些方法进行选择。可选择的方法使得使用者可以更改类集的内容。支持这些方法的类集被称为可修改的(modifiable)。不允许修改其内容的类集被称为不可修改的(unmodifiable)。如果对一个不可修改的类集使用这些方法,将引发一个UnsupportedOperationException异常。所有内置的类集都是可修改的。 下面讨论类集接口。 15.2.1 类集接口 Collection接口是构造类集框架的基础。它声明所有类集都将拥有的核心方法。这些方法被总结在表15-1中。因为所有类集实现Collection,所以熟悉它的方法对于清楚地理解框架是必要的。其中几种方法可能会引发一个UnsupportedOperationException异常。正如上面解释的那样,这些发生在当类集不能被修改时。当一个对象与另一个对象不兼容,例如当企图增加一个不兼容的对象到一个类集中时。将产生一个ClassCastException异常。表15-1 由Collection 定义的方法 方法描述 boolean add(Object obj) 将obj加入到调用类集中。如果obj被加入到类集中了,则返 回true;如果obj已经是类集中的一个成员或类集不能被复制时,则返回falseboolean addAll(Collection c) 将c中的所有元素都加入到调用类集中,如果操作成功(也就是说元素被加入了),则返回true;否则返回falsevoid clear( ) 从调用类集中删除所有元素boolean contains(Object obj) 如果obj是调用类集的一个元素,则返回true,否则,返回falseboolean containsAll(Collection c) 如果调用类集包含了c中的所有元素,则返回true;否则,返回falseboolean equals(Object obj) 如果调用类集与obj相等,则返回true;否则返回falseint hashCode( ) 返回调用类集的散列码boolean isEmpty( ) 如果调用类集是空的,则返回true;否则返回falseIterator iterator( ) 返回调用类集的迭代程序Boolean remove(Object obj) 从调用类集中删除obj的一个实例。如果这个元素被删除了,则返回true;否则返回falseBoolean removeAll(Collection c) 从调用类集中删除c的所有元素。如果类集被改变了(也就是说元素被删除了),则返回true;否则返回falseBoolean retainAll(Collection c) 删除调用类集中除了包含在c中的元素之外的全部元素。如果类集被改变了(也就是说元素被删除了),则返回true,否则返回falseint size( ) 返回调用类集中元素的个数Object[ ] toArray( ) 返回一个数组,该数组包含了所有存储在调用类集中的元素。数组元素是类集元素的拷贝Object[ ] toArray(Object array[ ]) 返回一个数组,该数组仅仅包含了那些类型与数组元素类型匹配的类集元素。数组元素是类集元素的拷贝。如果array的大小与匹配元素的个数相等,它们被返回到array.如果array的大小比匹配元素的个数小,将分配并返回一个所需大小的新数组,如果array的大小比匹配元素的个数大,在数组中,在类集元素之后的单元被置为null.如果任一类集元素的类型都不是array 的子类型, 则引发一个ArrayStoreException异常 调用add( )方法可以将对象加入类集。注意add( )带一个Object类型的参数。因为Object是所有类的超类,所以任何类型的对象可以被存储在一个类集中。然而原始类型可能不行。例如,一个类集不能直接存储类型int,cha |