走進原始碼——Vector閱讀筆記

liangxingwei發表於2017-12-14

本文原創掘金:L_Sivan

Vector

繼承自AbstractList,實現了List,RandomAccess,Cloneable,和Serializable介面,具有List的特性,提供可隨機訪問,提供自身克隆以及序列化的一個容器類。 特點:執行緒安全;陣列實現

Vector的實現和ArrayList沒什麼區別,這裡就不列成員變數和一些共有的方法了,有興趣可以去看走進原始碼——ArrayList閱讀筆記,這篇主要講Vector和ArrayList的區別

  • 區別一:執行緒安全 在ArrayList中,所有的方法都是執行緒不安全的,在多執行緒環境下很容易出問題,而Vector就不一樣了,Vector在涉及到操作容器資料的方法上,都加上了synchronized關鍵字,甚至是迭代器的獲取上也加上了這個關鍵字,我們可以感受下

    帶synchronized關鍵字的獲取迭代器的方法
    帶synchronized關鍵字的remove的方法
    但是,凡事有利弊,這種執行緒絕對安全的保證的一個最明顯的負面效應就是效能的損耗,特別是很多執行緒同時操作同一個Vector物件時,那麼將會有很多很多執行緒被阻塞,是很不利於系統效能的。

  • 區別二:初始化 相對於ArrayList中的初始化,Vector的其中一個初始化函式多了一個

      protected int capacityIncrement;
複製程式碼

形參,這個形參如其名,容量增長,取好聽點,我們叫容量增長因子。

      public Vector(int initialCapacity, int capacityIncrement) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
        this.capacityIncrement = capacityIncrement;
      }
複製程式碼

類似於ArrayList的帶initialCapacity形參的建構函式,區別就在於初始化自身的capacityIncrement屬性而已,其次還有下面兩個

      public Vector(int initialCapacity) {
        this(initialCapacity, 0);
      }
      public Vector() {
        this(10);
      }
複製程式碼

這裡吐槽下**this(10);**,在ArrayList那裡起碼還有一個DEFAULT_CAPACITY,在Vector這裡直接就是10....是懶了嗎...Vector的預設初始化就是容量為10,容量增長因子為0

  • 區別三:容量增長 在ArrayList中容量是1.5倍增加的,可能Vector的設計者覺得這個1.5太可怕了(特別在數量級達到萬之後的單位),所以才在vector裡增加這個容量增長因子的東西,下面直接上核心程式碼
      private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        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);
      }
複製程式碼

很明顯,如果在初始化的時候傳入了capacityIncrement,那麼,vector的每次容量的增長都是以capacityIncrement為單位進行增長的,所以就沒有了ArrayList中直接增大1.5倍的爆炸增長速率

其餘的實現和ArrayList都是大同小異,這裡就不在撰述了

水平有限,難免有錯,還請評論區指正

相關文章