用途与特色
可用于在须要存储有序的,可动态扩充线程安全的集合。整理逻辑算法上基本与ArrayList相同,但在操作数据的方法上都使用了synchronized关键字,在多 线程调用时,会将并行请求,变为串行请求,由于使用了synchronized方法,因此他的性能方面比ArrayList要差。建议在非线程下使用ArrayList。算法
实现算法数组
底层实现方式其实就是Object[]数组实现,根据封装会存储实际存储大小elementCount对象,与存放数据的elementData。算法基本与ArrayList相同。安全
默认初始数组长度是10,最大集合长度是Integer.MAX_VALUE大概21亿多并发
添加性能
删除线程
在删除数据时只会对数组进行移到操做,并不会修改调整数组的长度,因此对于内存方面如建立一个长度是100的数据集合,删除了90个数据,集合数组长度也不会缩小。code
public synchronized E remove(int index) { modCount++; if (index >= elementCount) throw new ArrayIndexOutOfBoundsException(index); E oldValue = elementData(index); int numMoved = elementCount - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--elementCount] = null; // Let gc do its work return oldValue; }
扩容机制对象
扩容时机:是在加入数据时,elementData已满时进行扩容blog
扩充的新数组长度是: 原数组长度 + (原数组长度 / 2)内存
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); }
是否线程安全,为何?
线程安全,在源码中对数据操做使用synchronized方法,保证了并发锁。
根据jdk1.8版本源码解读