用途与特色
可用于在须要存储有序的,可动态扩充集合大小的状况使用。能够看作是一个动态的数组。虽然该集合理论上是能够动态无限扩充,但也有最大长度限制。算法
实现算法数组
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版本源码解读