Enumeration接口定义的一些方法可以用于枚举对象集合
Enumeration接口的地位被迭代器给取代,但是Vector与Properties这些类中还有其身影,接着了解一下Enumeration接口实现枚举的过程,顺便学习Vector类。
Enumeration中的一些方法
boolean hasMoreElements( ) //枚举对象中是否还有多余的元素。
Object nextElement() //对象中如果还有多的元素则返回下个元素。
import java.util.Enumeration;
import java.util.Vector;
public class EnumerationTester {
public static void main(String args[]) {
//定义一个枚举对象
Enumeration<String> days;
//Vector类创建一个对象集合
Vector<String> dayNames = new Vector<String>();
//使用Vector类的方法添加元素至对象集合
dayNames.add("Sunday");
dayNames.add("Monday");
dayNames.add("Tuesday");
dayNames.add("Wednesday");
dayNames.add("Thursday");
dayNames.add("Friday");
dayNames.add("Saturday");
//枚举对象指向对象集合
days = dayNames.elements();
//对象集合中有元素则执行while循环
while (days.hasMoreElements()){
//若集合中有元素则打印下个元素
System.out.println(days.nextElement());
}
}
}
console结果
Sunday
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
Vector中存放元素的顺序与Object nextElement返回的值顺序一致,是否可以认为Vector存放在栈区中。对于初学者的我来说只能有这么粗浅的拙见。接下来就来进一步了解Vector类。
Vector是一个数组类,实现了动态数组,但是其与ArrayList又有着不同点:
Vector是Java早期提供的线程安全的动态数组,其方法通过synorzisynchronized实现同步支持,如果不需要线程安全,不建议选择。Vector内部是使用对象数组来保存数据,可以根据需要自动增加容量。当数据已满时,会创建新的数组,并拷贝原有数组数据。
ArrayList是应用更加广泛的动态数组实现,它不是线程安全的,所以性能要好很多。与Vector近似,ArrayList也可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector在扩容时会提高1倍,而ArrayList则是增加50%。
源码中的构造方法:
public Vector() {
this(10);//无参构造,默认值为10
}
public Vector(int initialCapacity, int capacityIncrement) {
//创建指定大小的向量,并且增量用 incr 指定。增量表示向量每次增加的元素数目
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
this.capacityIncrement = capacityIncrement;
}
public Vector(int initialCapacity) {//构造方法创建指定大小的向量
this(initialCapacity, 0);
}
public Vector(Collection<? extends E> c) {//创建一个包含集合 c 元素的向量
elementData = c.toArray();
elementCount = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, elementCount, Object[].class);
}
Vector的数据结构和ArrayList差不多,它包含了3个成员变量:elementData , elementCount, capacityIncrement。
(01) elementData 是"Object[]类型的数组",它保存了添加到Vector中的元素。elementData是个动态数组,如果初始化Vector时,没指定动态数组的>大小,则使用默认大小10。随着Vector中元素的增加,Vector的容量也会动态增长,capacityIncrement是与容量增长相关的增长系数,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
(02) elementCount 是动态数组的实际大小。
(03) capacityIncrement 是动态数组的增长系数。如果在创建Vector时,指定了capacityIncrement的大小;则,每次当Vector中动态数组容量增加时>,增加的大小都是capacityIncrement。
package java.util;
public class Vector<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
// 保存Vector中数据的数组
protected Object[] elementData;
// 实际数据的数量
protected int elementCount;
// 容量增长系数
protected int capacityIncrement;
// Vector的序列版本号
private static final long serialVersionUID = -2767605614048989439L;
// Vector构造函数。默认容量是10。
public Vector() {
this(10);
}
// 指定Vector容量大小的构造函数
public Vector(int initialCapaci