Java集合-Vector源码解析-JDK1.8

Vector简介

与ArrayList不同的是,Vector是线程安全的。

建议先阅读 ArrayList源码分析 ,再回来看此文会Soeasy哦!

Vector继承了AbstractList实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。

  1. AbstractList、List提供了添加、删除、修改、遍历等功能。

  2. RandmoAccess提供了随机访问功能

  3. Cloneable提供了可以被克隆的功能

  4. Serializable提供了序列化的功能

Vector的属性

 /**	
     * 真实存储Vector元素的数组缓冲区	
     */	
    protected Object[] elementData;	

	
    /**	
     * Vector的实际元素数量	
     */	
    protected int elementCount;	

	
    /**	
     * 容量增长系数	
     */	
    protected int capacityIncrement;	
    /**	
     * Vector能够增长到的最大容量	
     */	
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

Vector的构造方法

    	
   /**	
     * 指定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);	
    }	

	
    /**	
     * 将集合的数据转换成Vector	
     */	
    public Vector(Collection 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添加元素

 /**	
     * 添加方法	
     */	
    public synchronized boolean add(E e) {	
        modCount++;	
        ensureCapacityHelper(elementCount + 1);	
        elementData[elementCount++] = e;	
        return true;	
    }	
    /**	
     * 指定索引添加元素	
     */	
    public void add(int index, E element) {	
        insertElementAt(element, index);	
    }	
    /**	
     * 在index索引位置插入数据	
     */	
    public synchronized void insertElementAt(E obj, int index) {	
        modCount++;	
        if (index > elementCount) {	
            throw new ArrayIndexOutOfBoundsException(index	
                    + " > " + elementCount);	
        }	
        ensureCapacityHelper(elementCount + 1);	
        System.arraycopy(elementData, index, elementData, index + 1, elementCount - index);	
        elementData[index] = obj;	
        elementCount++;	
    }	
    /**	
     * 添加数据	
     */	
    public synchronized void addElement(E obj) {	
        modCount++;	
        ensureCapacityHelper(elementCount + 1);	
        elementData[elementCount++] = obj;	
    }

可以看的,这几个添加方法最终都被synchronize关键字所修饰包括查询、修改和删除),只有这样才能保证线程安全。

Vector扩容

相信细心的你一定发现了上述的添加方法都调用了一个方法ensureCapacityHelper,这个方法就是用来确认Vector的容量的方法

/**	
     * 确认Vector的容量	
     */	
    private void ensureCapacityHelper(int minCapacity) {	
        // overflow-conscious code	
        if (minCapacity - elementData.length > 0)	
            //调用扩容方法	
            grow(minCapacity);	
    }	
    //扩容	
    private void grow(int minCapacity) {	
        // overflow-conscious code	
        int oldCapacity = elementData.length;	
        //如果指定了容量增长系数则按照capacityIncrement扩容,否则增大一倍	
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?	
                capacityIncrement : oldCapacity);	
        //如果扩容后还不能存下元素,则使用minCapacity作为最新的容量	
        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;	
    }

Vector的查询和修改

修改和查询方法都比较简单

   /**	
     * 更新	
     */	
    public synchronized E set(int index, E element) {	
        if (index >= elementCount)	
            throw new ArrayIndexOutOfBoundsException(index);	

	
        E oldValue = elementData(index);	
        elementData[index] = element;	
        return oldValue;	
    }	
     public synchronized E get(int index) {	
        if (index >= elementCount)	
            throw new ArrayIndexOutOfBoundsException(index);	

	
        return elementData(index);	
    }	
    @SuppressWarnings("unchecked")	
    E elementData(int index) {	
        return (E) elementData[index];	
    }

Vector的删除

涉及到了一个数组copy的过程

 /**	
     * 删除指定索引位置的元素	
     */	
    public synchronized E remove(int index) {	
        modCount++;	
        if (index >= elementCount)	
            throw new ArrayIndexOutOfBoundsException(index);	
        E oldValue = elementData(index);	

	
        int numMoved = elementCount - index - 1;	
        if (numMoved > 0)	
            System.arraycopy(elementData, index + 1, elementData, index,	
                    numMoved);	
        elementData[--elementCount] = null; // Let gc do its work	

	
        return oldValue;	
    }

 
鉴于篇幅有限,本篇文章仅列出上方部分代码,Vector完整源码解析请 点击下方“阅读原文”查看!!!

640?wx_fmt=gif

不得不看

1.SpringCloud系列博客汇总

2.Java多线程面试必备基础知识汇总

640?wx_fmt=jpeg

万水千山总是情,点个 “在看” 行不行!!!

640?wx_fmt=png 

你可能感兴趣的:(Java集合-Vector源码解析-JDK1.8)