以新new一个arrayList来分析arrayList的方法都干了些什么。
//step1:实例化ArrayList
ArrayList list=new ArrayList();
//对应源码:
/*arraylist构造器,初始化elementData为一个空数组,
DEFAULTCAPACITY_EMPTY_ELEMENTDATA为静态变量空的数组*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//step2:添加基础元素调用list的add方法:
list.add("hello word");
//对应源码:
public boolean add(E e) {
/*此方法是重点方法,里面的逻辑为,如果elementData为空那么增加默认的数组长度为10,
如果elementData不为空,size+1大于elementData数组长度,那么开始扩容:扩容的规则为如果size+1小于当前数组长度的1.5倍,那么扩容到当前数组的1.5倍,然后
注意:扩容最大到Integer.MAX_VALUE*/
ensureCapacityInternal(size + 1); // size为当前数组元素个数
elementData[size++] = e;
return true;
}
//step3:获取元素的方法,是从数组中获取下标对应的值,不用多说
list.get(0);
//step4:删除指定内容
list.remove(0);
//对应源码:
public E remove(int index) {
rangeCheck(index);
modCount++;
E oldValue = elementData(index);
int numMoved = size - index - 1;
if (numMoved > 0)
/*关键方法: public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,比如:
int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);
则结果为:{0,1,2,0,1,2,6};
实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos
到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).**/
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null;
return oldValue;
}