Java集合---ArrayList(2)

用途與特色
可用於在須要存儲有序的,可動態擴充集合大小的狀況使用。能夠看作是一個動態的數組。雖然該集合理論上是能夠動態無限擴充,但也有最大長度限制。算法

實現算法數組

ArrayList的底層實現方式其實就是Object[]數組實現,根據封裝會存儲實際存儲大小Size對象,與存放數據的elementData。安全

默認初始數組長度是10,最大集合長度是Integer.MAX_VALUE大概21億多this

添加線程

添加數據擴容

刪除code

刪除邏輯

在刪除數據時只會對數組進行移到操做,並不會修改調整數組的長度,因此對於內存方面如建立一個長度是100的數據集合,刪除了90個數據,集合數組長度也不會縮小。對象

public E remove(int index) {
        rangeCheck(index);

        modCount++;
        E oldValue = elementData(index);

        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);//只對數組進行了移動,並未調整數組大小
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

擴容機制blog

擴容時機:是在加入數據時,elementData已滿時進行擴容內存

擴充的新數組長度是: 原數組長度 + (原數組長度 / 2)ci

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版本源碼解讀

相關文章
相關標籤/搜索