java基礎:Vector/Stack — 源碼分析

其餘更多java基礎文章:
java基礎學習(目錄)java


概述

雖然,Vector和Stack在咱們的編程中,使用的比較少,至少我使用的比較少,通常狀況下,我都是傾向於使用List來存儲一些同類型的元素。
Vector的內部實現和ArrayList的內部實現基本一致,內部都是藉助於數組來實現的,主要區別是方法加了synchronized關鍵字,實現了線程安全。
Stack是繼承自Vector來實現的,並且Stack只是在Vector的基礎上提供了幾個方法罷了,就不展開講解了。編程

Vector

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
複製代碼

Vector繼承了AbstractList抽象類並實現了List、RandomAccess、Cloneable、Serializable接口,和ArrayList同樣。數組

基礎字段

protected Object[] elementData;
    protected int elementCount;
    protected int capacityIncrement;
複製代碼
  • elementData:數組,用來存放元素的
  • elementCount:記錄數組中已經保存了的數據的個數
  • capacityIncrement:自動擴容的大小,即當數組滿了以後,就添加capacityIncrement個空間裝載元素,若是capacityIncrement<=0,則擴容時就擴容到目前Vector容量的兩倍

方法細節

add方法

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);
    }

    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++;
    }
    
    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        //當數組已滿,則調用grow函數來對數組進行擴容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //擴容的大小由capacityIncrement決定,若是capacityIncrement<=0,則擴容到目前數組的兩倍
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        //檢查是否newCapacity溢出了
        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;
    }
複製代碼

基本沒什麼難度,增長了synchronized關鍵字,實現了線程安全,其餘跟ArrayList的基本同樣。能夠參考java基礎:ArrayList — 源碼分析
惟一有點不一樣的是,Vector的擴容默認是擴容爲2倍,若capacityIncrement不爲0,則擴容capacityIncrement的值。ArrayList則是擴容爲1.5倍。安全

總結

  1. Vector是基於數組來實現的
  2. Vector是線程安全的,ArrayList是線程不安全的。
  3. Vector實現基本與ArrayList同樣
相關文章
相關標籤/搜索