- 扩容方法 ensureCapacity, 普通扩容类似只是截取了此方法中的5,6,7步。
MAX_ARRAY_SIZE = Integer.MAX_VALUE-8;
Integer.MAX_VALUE = 0x7fffffff;
/**
* 对elementData扩容
* 1. 原elementData=[], minCapacity<=10,无效操作
* 2. 原elementData=[], MAX_ARRAY_SIZE>=minCapacity>10, modCount++, elementData长度改为minCapacity
* 3. 原elementData=[], MAX_ARRAY_SIZE<minCapacity, modCount++, elementData长度改为Integer.MAX_VALUE
* 原elementData<>[], elementData长度最小是10
* 4. 原elementData<>[], minCapacity<=elementData长度, modCount++
* 5. 原elementData<>[], (elementData长度 * 1.5)>=minCapacity>elementData长度, modCount++ , elementData长度为(原elementData长度 * 1.5)
* 6. 原elementData<>[], MAX_ARRAY_SIZE>=minCapacity>(elementData长度 * 1.5), modCount++ , elementData长度为(原elementData长度 * 1.5)
* 7. 原elementData<>[], MAX_ARRAY_SIZE<minCapacity, modCount++ , elementData长度为Integer.MAX_VALUE
*
* @param minCapacity the desired minimum capacity
*/
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
? 0
: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
- System.arraycopy方法
System.arraycopy(elementData, index, elementData, index + 1, size - index);
- remove方法此处有内存泄露的例子,和在此处的解决办法
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;
return oldValue;
}
- fastRemove 不返回删除的对象,防止对象逃逸,增加了效率,所以称为fastRemove
private void fastRemove(int index) {
modCount++;
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;
}
- 其余部分方法注释见文件
https://download.csdn.net/download/liha12138/12498570