ArrayList解析
2016-07-29 本文已影响362人
风风风筝
基于JDK1.8
只列出关键方法,主要关注默认情况、初始化、扩容、add、remove。
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() { //默认是个空数组,也有重载方法可以设置初始数组大小
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
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); //默认就是10
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0) //超过数据长度
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); //按1.5倍扩容
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
get(int index)比较简单,直接返回elementData[index]。
ArrayList比较简单,默认情况下是空数据,第一次add默认初始化长度10,每次按1.5倍扩容。再看下remove
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1; //判断是不是最后一项,如果不是最后一项,就把该index后面的数据项都赋值给前一位,然后再把最后一项设为null
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; //这行代码值得很多人学习,数组集合里没用的项要及时释放
return oldValue;
}
附图