类集框架定义了几个接口。本节对每一个接口都进行了概述。首先讨论类集接口是因为它们决定了collection类的基本特性。不同的是,具体类仅仅是提供了标准接口的不同实现。支持类集的接口总结在如下的表中:
接口 | 描述 |
---|---|
Collection | 能使你操作对象组,它位于类集层次结构的顶层 |
List | 扩展Collection去处理序列(对象的列表) |
Set | 扩展Collection去处理集合,集合必须包含唯一元素 |
SortedSet | 扩展Set去处理排序集合 |
除了类集接口之外,类集也使用Comparator,Iterator和ListIterator接口。关于这些接口将在本章后面做更深入的描述。
简单地说,Comparator接口定义了两个对象如何比较;Iterator和ListIterator接口枚举类集中的对象。
为了在它们的使用中提供最大的灵活性,类集接口允许对一些方法进行选择。可选择的方法使得使用者可以更改类集的内容。支持这些方法的类集被称为可修改的。
不允许修改其内容的类集被称为不可修改的。如果对一个不可修改的类集使用这些方法,将引发一个UnsupportedOperationException异常。所有内置的类集都是可修改的。
Collection接口是构造类集框架的基础。它声明所有类集都将拥有的核心方法。这些方法被总结在下表中。因为所有类集实现Collection,所以熟悉它的方法对于清楚地理解框架是必要的。其中几种方法可能会引发一个UnsupportedOperationException异常。
正如上面解释的那样,这些发生在当类集不能被修改时。当一个对象与另一个对象不兼容,例如当企图增加一个不兼容的对象到一个类集中时。将产生一个ClassCastException异常。
Collection 定义的方法
方法 | 描述 |
---|---|
boolean add(Object obj) | 将obj加入到调用类集中。如果obj被加入到类集中了,则返回true;如果obj已经是类集中的一个成员或类集不能被复制时,则返回false |
boolean addAll(Collection c) | 将c中的所有元素都加入到调用类集中,如果操作成功(也就是说元素被加入了),则返回true;否则返回false |
void clear( ) | 从调用类集中删除所有元素 |
boolean contains(Object obj) | 如果obj是调用类集的一个元素,则返回true,否则,返回false |
boolean containsAll(Collection c) | 如果调用类集包含了c中的所有元素,则返回true;否则,返回false |
boolean equals(Object obj) | 如果调用类集与obj相等,则返回true;否则返回false |
int hashCode( ) | 返回调用类集的散列码 |
boolean isEmpty( ) | 如果调用类集是空的,则返回true;否则返回false |
Iterator iterator( ) | 返回调用类集的迭代程序 |
Boolean remove(Object obj) | 从调用类集中删除obj的一个实例。如果这个元素被删除了,则返回true;否则返回false |
Boolean removeAll(Collection c) | 从调用类集中删除c的所有元素。如果类集被改变了(也就是说元素被删除了),则返回true;否则返回false |
Boolean retainAll(Collection c) | 删除调用类集中除了包含在c中的元素之外的全部元素。如果类集被改变了(也就是说元素被删除了),则返回true,否则返回false |
int size( ) | 返回调用类集中元素的个数 |
Object[ ] toArray( ) | 返回一个数组,该数组包含了所有存储在调用类集中的元素。数组元素是类集元素的拷贝 |
Object[ ] toArray(Object array[ ]) | 返回一个数组,该数组仅仅包含了那些类型与数组元素类型匹配的类集元素。数组元素是类集元素的拷贝。如果array的大小与匹配元素的个数相等,它们被返回到array。如果array的大小比匹配元素的个数小,将分配并返回一个所需大小的新数组,如果array的大小比匹配元素的个数大,在数组中,在类集元素之后的单元被置为null。如果任一类集元素的类型都不是 array 的子类型,则引发一个ArrayStoreException异常 |
调用add( )方法可以将对象加入类集。注意add( )带一个Object类型的参数。因为Object是所有类的超类,所以任何类型的对象可以被存储在一个类集中。然而原始类型可能不行。
例如,一个类集不能直接存储类型int,char,double等的值。当然如果想存储这些对象,可以通过调用addAll( )方法将一个类集的全部内容增加到另一个类集中。
可以通过调用remove( )方法将一个对象删除。为了删除一组对象,可以调用removeAll( )方法。调用retainAll( )方法可以将除了一组指定的元素之外的所有元素删除。
为了清空类集,可以调用clear( )方法。通过调用contains( )方法,可以确定一个类集是否包含了一个指定的对象。为了确定一个类集是否包含了另一个类集的全部元素,可以调用containsAll( )方法。当一个类集是空的时候,可以通过调用isEmpty( )方法来予以确认。调用size( )方法可以获得类集中当前元素的个数。
toArray( )方法返回一个数组,这个数组包含了存储在调用类集中的元素。这个方法比它初看上去的能力要更重要。经常使用类数组语法来处理类集的内容是有优势的。通过在类集和数组之间提供一条路径,可以充分利用这两者的优点。
调用equals( )方法可以比较两个类集是否相等。“相等”的精确含义可以不同于从类集到类集。
例如,可以执行equals( )方法以便用于比较存储在类集中的元素的值,换句话说,equals( )方法能比较对元素的引用。
一个更加重要的方法是iterator( ),该方法对类集返回一个迭代程序。正如你将看到的那样,当使用一个类集框架时,迭代程序对于成功的编程来说是至关重要的。