15.10 从以前版本遗留下来的类和接口
正如本章开始时介绍的那样,Java.util的最初版本中不包括类集框架。取而代之,它定义了几个类和接口提供专门的方法用于存储对象。随着在Java 2中引入类集,有几种最初的类被重新设计成支持类集接口。因此它们与框架完全兼容。尽管实际上没有类被摈弃,但其中某些仍被认为是过时的。当然,在那些重复从以前版本遗留下来的类的功能性的地方,通常都愿意用类集编写新的代码程序。一般地,对从以前版本遗留下来的类的支持是因为仍然存在大量使用它们的基本代码。包括现在仍在被Java 2的应用编程接口(API)使用的程序。
另一点,没有一个类集类是同步的。但是所有的从以前版本遗留下来的类都是同步的。这一区别在有些情况下是很重要的。当然,通过使用由Collections提供的算法也很轻易实现类集同步。
由java.util定义的从以前版本遗留下来的类说明如下:
Dictionary Hashtable Properties Stack Vector
有一个枚举(Enumeration)接口是从以前版本遗留下来。在下面依次介绍Enumeration和每一种从以前版本遗留下来的类。
15.10.1 Enumeration接口
Enumeration接口定义了可以对一个对象的类集中的元素进行枚举(一次获得一个)的方法。这个接口尽管没有被摈弃,但已经被Iterator所替代。Enumeration对新程序来说是过时的。然而它仍被几种从以前版本遗留下来的类(例如Vector和Properties)所定义的方法使用,被几种其他的API类所使用以及被目前广泛使用的应用程序所使用。
Enumeration指定下面的两个方法:
boolean hasMoreElements( )
Object nextElement( )
执行后,当仍有更多的元素可提取时,hasMoreElements( )方法一定返回true.当所有元素都被枚举了,则返回false.nextElement( )方法将枚举中的下一个对象做为一个类属Object的引用而返回。也就是每次调用nextElement( )方法获得枚举中的下一个对象。调用例程必须将那个对象置为包含在枚举内的对象类型。
15.10.2 Vector
Vector实现动态数组。这与ArrayList相似,但两者不同的是:Vector是同步的,并且它包含了许多不属于类集框架的从以前版本遗留下来的方法。随着Java 2的公布,Vector被重新设计来扩展AbstractList和实现List接口,因此现在它与类集是完全兼容的。这里是Vector的构造函数:
Vector( )
Vector(int size)
Vector(int size, int incr)
Vector(Collection c)
第一种形式创建一个原始大小为10的默认矢量。第二种形式创建一个其原始容量由size指定的矢量。第三种形式创建一个其原始容量由size指定,并且它的增量由incr指定的矢量。增量指定了矢量每次答应向上改变大小的元素的个数。第四种形式创建一个包含了类集c中元素的矢量。这个构造函数是在Java 2中新增加的。
所有的矢量开始都有一个原始的容量。在这个原始容量达到以后,下一次再试图向矢量中存储对象时,矢量自动为那个对象分配空间同时为别的对象增加额外的空间。通过分配超过需要的内存,矢量减小了可能产生的分配的次数。这种次数的减少是很重要的,因为分配内存是很花时间的。在每次再分配中,分配的额外空间的总数由在创建矢量时指定的增量来确定。假如没有指定增量,在每个分配周期,矢量的大小增一倍。
Vector定义了下面的保护数据成员:
int capacityIncrement;
int elementCount;
Object elementData[ ];
增量值被存储在capacityIncrement中。矢量中的当前元素的个数被存储在elementCount中。保存矢量的数组被存储在elementData中。
除了由List定义的类集方法之外,Vector还定义了几个从以前版本遗留下来的方法,这些方法列在表15-10中。
表15-10 由Vector 定义的方法
方法描述
final void addElement(Object element) 将由element指定的对象加入矢量int capacity( ) 返回矢量的容量
Object clone( ) 返回调用矢量的一个拷贝Boolean contains(Object element) 假如element被包含在矢量中,则返回true;假如不包含于其中,则返回falsevoid copyInto(Object array[ ]) 将包含在调用矢量中的元素复制到由array指定的数组中Object elementAt(int index) 返回由index指定位置的元素Enumeration elements( ) 返回矢量中元素的一个枚举Object firstElement( ) 返回矢量的第一个元素int indexOf(Object element) 返回element首次出现的位置下标。假如对象不在矢量中,则返回-1
int indexOf(Object element, int start) 返回element在矢量中在start及其之后第一次出现的位置下标。假如该对象不属于矢量的这一部分,则返回-1
void insertElementAt(Object element,int index)在矢量中,在由index指定的位置处加入elementboolean isEmpty( ) 假如矢量是空的,则返回true.假如它包含了一个或更多个元素,则返回false
Object lastElement( ) 返回矢量中的最后一个元素int lastIndexOf(Object element) 返回element在矢量中最后一次出现的位置下标。假如对象不包含在矢量中,则返回-1
int lastIndexOf(Object element,int start) 返回element在矢量中,在start之前最后一次出现的位置下标。假如该对象不属于矢量的这一部分,则返回-1
void removeAllElements( ) 清空矢量,在这个方法执行以后,矢量的大小为0boolean removeElement(Object element) 从矢量中删除element.对于指定的对象,矢量中假如有其多个实例,则其中第一个实例被删除。假如成功删除,则返回true;假如没有发现对象,则返回falsevoid removeElementAt(int index) 删除由index指定位置处的元素void setElementAt(Object element,int index)将由index指定的位置分配给elementvoid setSize(int size) 将矢量中元素的个数设为size.假如新的长度小于老的长度,元素将丢失;假如新的长度大于老的长度,则在其后增加null元素int size( ) 返回矢量中当前元素的个数
续表
方法描述
String toString( ) 返回矢量的字符串等价形式void trimToSize( ) 将矢量的容量设为与其当前拥有的元素的个数相等因为Vector实现List,所以可以像使用ArrayList的一个实例那样使用矢量。也可以使用它的从以前版本遗留下来的方法来操作它。例如,在后面实例化Vector,可以通过调用addElement( )方法而为其增加一个元素。调用elementAt( )方法可以获得指定位置处的元素。调用firstElement( )方法可以得到矢量的第一个元素。调用lastElement( )方法可以检索到矢量的最后一个元素。使用indexOf( ) 和lastIndexOf( ) 方法可以获得元素的下标。调用removeElement( )或removeElementAt( )方法可以删除元素。
下面的程序使用矢量存储不同类型的数值对象。程序说明了几种由Vector定义的从以前版本遗留下来的方法,同时它也说明了枚举(Enumeration)接口。
// Demonstrate various Vector operations.
import java.util.*;
class VectorDemo {
public static void main(String args[]) {
// initial size is 3, increment is 2
Vector v = new Vector(3, 2);
System.out.println("Initial size: " + v.size());
System.out.println("Initial capacity: " +
v.capacity());
v.addElement(new Integer(1));
v.addElement(new Integer(2));
v.addElement(new Integer(3));
v.addElement(new Integer(4));
System.out.println("Capacity after four additions: " +
v.capacity());
v.addElement(new Double(5.45));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Double(6.08));
v.addElement(new Integer(7));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Float(9.4));
v.addElement(new Integer(10));
System.out.println("Current capacity: " +
v.capacity());
v.addElement(new Integer(11));
v.addElement(new Integer(12));
System.out.println("First element: " +
(Integer)v.firstElement());
System.out.println("Last element: " +
(Integer)v.lastElement());
if(v.contains(new Integer(3)))
System.out.println("Vector contains 3.");
// enumerate the elements in the vector.
Enumeration vEnum = v.elements();
System.out.println("\nElements in vector:");
while(vEnum.hasMoreElements())
System.out.print(vEnum.nextElement() + " ");
System.out.println();
}
}
该程序的输出如下所示: