标签:object 字段 size ons 并发 变化 add data over
public boolean add(E e) { ensureCapacityInternal(size + 1); // 确认容量,看下一个位置是不是没了 elementData[size++] = e; // 容量允许的话,放在当前元素的下一个位置 return true; }
确认容量的方法:
private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 如果当前数组为空 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); // 数组容量取 默认容量跟给定数据的较大者 } ensureExplicitCapacity(minCapacity); // 确定明确的容量数值 }
这里要了解的是两个变量的初始值:
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; transient Object[] elementData; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
可以看到,elementData这个初始值是个null,但ArrayList创建的时候进行了赋值,因此这里有这个(elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)判断。
确定明确数值的方法:
private void ensureExplicitCapacity(int minCapacity) { modCount++; // 这个字段跟并发有关,稍后解释 // overflow-conscious code if (minCapacity - elementData.length > 0) //给定值大于数组长度 grow(minCapacity); }
长度增长方法:
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); // 新长度为原来的+原来的一半(初始10,变为15) if (newCapacity - minCapacity < 0) // 加一半后长度还是不够,则用传递过来的数值(addAll来说,就是原长度+新集合长度) 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); }
---------------------------------
/** * The maximum size of array to allocate. * Some VMs reserve some header words in an array. * Attempts to allocate larger arrays may result in * OutOfMemoryError: Requested array size exceeds VM limit */
标签:object 字段 size ons 并发 变化 add data over
原文地址:http://www.cnblogs.com/nevermorewang/p/7808164.html