Java集合工具类之List - Vector & Stack

本文深入探讨了Vector数据结构的工作原理,包括其动态扩容机制及如何通过构造器设置初始容量和增量。此外,还介绍了Vector在多线程环境下的使用注意事项,并展示了如何利用Vector快速构建Stack数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

3. List

3.1 Vector

1 Vector 的数据结构和工作原理

Vector 是基本数据结构一个可变数组,数组的元素可以是任意对象,当 Vector 初始创建时,会创建一个一定容量(Capacity)的(默认为 10 )数组对象,当添加的对象超过数组的容量时, Vector 在内部会重新创建一个新的数组,再把原数组元素拷贝到新的数组里面,这样就完成了动态数组的功能。 Vector 的构造器有三种

1) public Vector(int initialCapacity, int capacityIncrement)

initialCapacity 是数组的初始化长度, capacityIncrement 是当数组长度超过原长度时,数组长度增长的步长, capacityIncrement0 时,此种情况当数组长度超过原长度峰值时,此时数组长度变为原来的 2 倍。当数组长度变化,原有的数据和新的数组对象是通过 copy 来完成的。

2) public Vector(int initialCapacity)

3) public Vector()

Vector 默认构造器的数组的长度是 10

 

 

核心方法:

/**

     * 核心方法之一:保证数组的容量,如果没有指定容量的增长的步长,则将原数组容量扩 * 大成原来的两倍,如果指定则按照增长的步长增加容量,并且取 minCapacity*newCapacity 计算出来的最大值进行取值。计算出来的最终容量将作为新数组对象的尺 * 寸,并将原来数组的元素 copy 到新数组里面来。

     *

     * @see #ensureCapacity(int)

     */

    private void ensureCapacityHelper( int minCapacity) {

    int oldCapacity = elementData . length ;

    if (minCapacity > oldCapacity) {

        Object[] oldData = elementData ;

        int newCapacity = ( capacityIncrement > 0) ?

       (oldCapacity + capacityIncrement ) : (oldCapacity * 2);

         if (newCapacity < minCapacity) {

       newCapacity = minCapacity;

        }

            elementData = Arrays.copyOf ( elementData , newCapacity);

    }

    }

 

2.Vector 使用时需要注意的问题

1) Vector 使用时,最好能够预期需要存放元素的个数,这样可以避免数组长度频繁的改变而引起数据的 copy 带来的开销,同时会引起内存大小的增加。

2 )使用 Vector 需要知道 Vector 是线程安全的。因此,在使用时,最好是考虑这个对象会不会因为多个线程访问该 Vector 对象,如果确认只有单个线程访问,则可以用 ArrayList 来代替 Vector

 

 

3.    Stack

Vector 可以轻松改造成 Stack ,栈的特点是先进后出,对于一个栈来说,主要方法包括, push(E e), pop, peek,emptysearch(E e).

public class Stack <E> extends Vector<E> {

   

    public Stack(){

       super (10);

    }

   

    public void push(E e){

       this .add(e);

    }

   

    public E pop(){

       return this .remove( this .size()-1);

    }

   

    public boolean empty(){

       return this .size()==0;

    }

   

    public int search(E e){
        for (int i = 0; i < this.size(); i++) {
            if(this.elementAt(i).equals(e)){
                return i;
            }else{
                continue;
            }
        }
       
        return -1;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值