首先第一点就是我们能够看见ArrayList集合类主要是java.util包下面的一个类。这个类主要继承了AbstractList类,以及实现了List接口
//arrayList主要是位于java.util这个类库下面的类
package java.util;
//这个类主要实现哪些接口以及继承了哪些类
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Seriali
第二点看下它里面定义的属性以及他们之间的作用
//静态常量初始值设置为:10
private static final int DEFAULT_CAPACITY = 10;
//空元素数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//默认初始空元素数据
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//Object数组用elementData变量表示
transient Object[] elementData;
//其中我们能够看见transient只能够修饰变量,变量不能变成持久化的一部分,该变量内容序列化之后不能被访问
//访问arrayList集合的长度
private int size;
第三:add(Element e)方法源码解析
/**
*这个方法首先是判断是否扩容处理,然后在原来的数组的size+1索引赋值为e
*/
public boolean add(E e) {
//数组复制,并且判断size+1的容量判断
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
//还是数组复制,calculateCapacity是判断当前数组的容量大小判断
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
//判断数组中的元素是否为默认的数组,如果是就取默认容量与size +1两者中的最大值,否则就会取size +1的值
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
//这个方法中主要是记录了集合中元素的改变以及判断size+1与数组的长度大小比较,如果超出就需要进行扩容操作
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//首先将原来数组的长度进行扩大的操作 int newCapacity = oldCapacity + (oldCapacity >> 1); 也就是将这里原来的容量进行增加1.5倍
elementData = Arrays.copyOf(elementData, newCapacity); 核心的代码其实就是这行将原来的数组利用system.arraycopy方法进行数组复制
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
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);
}
第四点:remove(int index)方法的源码解析
/**
这个方法主要的逻辑就是首先校验index是否超过数组的长度,然后就是记录modCount操作次数,计算出需要移动的元素个数,再调用System.copyof()方法进行数组复制,然后将数组的--size元素赋值为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;
}
第五点:remove(Object obj)方法解析,首先我们可以看一下源码的解析
/**‘
首先是判断元素是否为null,如果为null值那么就循环遍历数组,找出第一次出现null的元素然后就是调用fastremove(int index)方法,不为null值时那么就调用Object中的equals方法,然后就调用fastremove方法
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
/**
其实我们在查看fastremove方法时,我们能够看到这里面的思路是跟我们前面找到的remove(int index)是一样的
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; // clear to let GC do its work
}
第五点get(int index)
/**
首先是对index的索引下标值进行校验,符合之后的话,就直接调用数组中的索引
public E get(int index) {
rangeCheck(index);
return elementData(index);
}