用途與特色
可用於在須要存儲有序的,可動態擴充集合大小的狀況使用。能夠看作是一個動態的數組。雖然該集合理論上是能夠動態無限擴充,但也有最大長度限制。算法
實現算法數組
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版本源碼解讀