1. 程式人生 > >Java集合---ArrayList(2)

Java集合---ArrayList(2)

用途與特點
可用於在需要儲存有序的,可動態擴充集合大小的情況使用。可以看做是一個動態的陣列。雖然該集合理論上是可以動態無限擴充,但也有最大長度現實,

實現演算法

ArrayList的底層實現方式其實就是Object[]陣列實現,更具封裝會儲存實際儲存大小Size物件,與存放資料的elementData。

預設初始陣列長度是10,最大集合長度是Integer.MAX_VALUE大概21億多

新增

新增資料擴容

刪除

刪除邏輯

在刪除資料時只會對陣列進行移到操作,並不會修改調整陣列的長度,所以對於記憶體方面如建立一個長度是100的資料集合,刪除了90個數據,集合陣列長度也不會縮小。

擴容機制

擴容時機:是在加入資料時,elementData已滿時進行擴容

擴充的新陣列長度是: 原陣列長度 + (原陣列長度 / 2)

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//新陣列擴容初始大小
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

是否執行緒安全,為什麼?

非執行緒安全,因為在原始碼中未對資料的新增、刪除、讀取等做鎖操作

根據jdk1.8版本原始碼解讀