1.构造器
A.无参构造
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//空
}
B.有参构造
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
2.add方法解析
add方法
add方法具体的详解
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!! 数组add的方法核心
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//calculateCapacity方法 数组初始化的时候为空,通过MATH的max取最大的初始值大小
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);//数组初始化的时候大小赋值
}
return minCapacity;
}
//ensureExplicitCapacity方法
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
//通过数组初始化值 和 当前数组长度 来判断 是否要扩容
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//grow方法 数组扩容的源码分析
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//新数组的长度 = 现有的数据长度 * 1.5的N次方
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
//超过int的最大值 内存溢出 反之现有数组长度和int的最大值通过三目表达式取相对应的值
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
3.remove
/*
1.先判断当前数组下标有无数组越界的异常
2.获取数组下标对应的数组具体的值
3.通过原生的API接口处理
A.System.arraycopy(原数组,从元数据的起始位置开始,目标数组,目标数组的开始起始位置,要copy的数组的长度)
B.将复制后的数组最后一位index对应的值值为空
EG:index 1 value 2
原数组: 1,2,3,4
方法处理: System.arraycopy(原数组,从元数据的起始位置开始,目标数组,目标数组的开始起始位置,要copy的数组的长度)
新数组: 1,3,4,null
*/
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;
}