在ArrayList源码详细分析JDK1.8(一)中我们详细分析了ArrayList中最核心的add方法。
//上图中的数组
transient Object[] elementData;
//元素个数
private int size;
功能描述:返回集合中指定位置上的对象
//E是泛型,向ArrayList中存入什么类型,E就是什么类型
public E get(int index) {
//判断是否越界
rangeCheck(index);
//取出这个对象
return elementData(index);
}
判断越界
private void rangeCheck(int index) {
//大于数组存储元素的个数,抛出越界异常
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
取出数组中取出对象
E elementData(int index) {
return (E) elementData[index];
}
功能描述:返回集合中的元素个数
public int size() {
//返回size的值
return size;
}
功能描述:从集合中删除指定index处的元素,返回该元素
public E remove(int index) {
//判断是否越界
rangeCheck(index);
modCount++;
//取出这个对象
E oldValue = elementData(index);
//numMoved 等于要移动的元素个数
int numMoved = size - index - 1;
if (numMoved > 0)
//图二,图三
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
//图四
elementData[--size] = null;
//返回要remove的那个元素
return oldValue;
}
图一:
假设 remove(1),即 index = 1。
图二:
numMoved = size - index -1 = 4 - 1 - 1 = 2
System.arraycopy(elementData, index+1, elementData, index,numMoved)
就是
System.arraycopy(elementData, 2, elementData, 1,2)
图三:
图四:
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
arraycopy方法调用的是本地方法,navtive 方法是 Java 通过 JNI(Java本地库接口) 直接调用本地 C/C++ 库,可以认为native 方法相当于 C/C++ 暴露给 Java 的一个接口。
参数的含义是:
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制几个
public static void main(String[] args) {
Integer[] src = {100,200,300,400,500};
System.arraycopy(src, 2, src, 1, 3);
for (int i = 0; i < src.length; i++) {
System.out.print(" "+src[i]);
}
}
结果:
100 300 400 500 500
功能描述:清空集合中所有元素
public void clear() {
modCount++;
//数组中所有元素赋值为null
for (int i = 0; i < size; i++)
//方便垃圾回收器回收
elementData[i] = null;
size = 0;
}
功能描述:用指定元素obj替代集合中指定位置上的元素
public E set(int index, E element) {
//越界检查
rangeCheck(index);
//取出这个对象
E oldValue = elementData(index);
//将指定对象存入数组
elementData[index] = element;
//返回被替代的元素
return oldValue;
}