学习Enumeration接口、Vector类

本文介绍了Java中的Enumeration接口,尽管已被迭代器取代,但依然在Vector和Properties类中使用。文章详细讲解了Enumeration的hasMoreElements()和nextElement()方法,并展示了Vector类的特性,包括其作为线程安全的动态数组与ArrayList的区别。Vector的内部结构包括elementData、elementCount和capacityIncrement三个成员变量,以及它们的作用。此外,还概述了Vector的一些关键方法。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值