Vector源码笔记

对Vector最大印象就是它是一个线程安全的容器类,话不多说,直接看向源码。

public class Vector
    extends AbstractList
    implements List, RandomAccess, Cloneable, java.io.Serializable
{
    // 保存Vector中数据的数组
    protected Object[] elementData;

    // 实际数据的数量
    protected int elementCount;

    // 容量增长系数
    protected int capacityIncrement;
}
  • Vector是一个队列,继承AbstractList,实现List,所以它支持队列的一些操作
  • Vector 实现 RandomAccess 所提供的随机访问功能,RandmoAccess是java中用来被List实现,为List提供快速访问功能的。所以在Vector中可以通过元素的序号快速获取元素对象;这就是快速随机访问
  • 实现了Cloneable接口,即实现clone()函数。它能被克隆。
  • 可被序列化
  • 最重要一点,它是线程安全的

构造函数:

 // 指定Vector"容量大小"和"增长系数"的构造函数
    public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
    }

    // 指定Vector容量大小的构造函数
    public Vector(int initialCapacity) {
        this(initialCapacity, 0);
    }

    // Vector构造函数。默认容量是10
    public Vector() {
        this(10);
    }

扩容机制:

//Vectory的扩容
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //capacityIncrement大于0就相加否则原来容量扩大一倍
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

clone()

//// 克隆函数
    public synchronized Object clone() {
        try {
            @SuppressWarnings("unchecked")
            Vector v = (Vector) super.clone();
            // 将当前Vector的全部元素拷贝到v中 
            v.elementData = Arrays.copyOf(elementData, elementCount);
            v.modCount = 0;
            return v;
        } catch (CloneNotSupportedException e) {
            // this shouldn't happen, since we are Cloneable
            throw new InternalError(e);
        }
    }

Vector里面重要方法就这些,别的方法没啥看的,需要注意的是Vector是线程安全的,它的很多方法都加了synchronized关键字。
总结:

  • Vector实际上是通过一个数组去保存数据的。当我们构造Vector时;若使用默认构造函数,则Vector的默认容量大小是10。
  • 当Vector容量不足以容纳全部元素时,Vector的容量会增加。若容量增加系数 >0,则将容量原来的值增加“容量增加系数”;否则,将容量大小增加一倍。
  • Vector的克隆函数,即是将全部元素克隆到一个数组中。

你可能感兴趣的:(Vector源码笔记)