arraylList.add(int,obj)的底层是怎么样的??
首先我们查看一下源码是如何的:
arrayList是在jdk中rt.jar包下的 jdk1.8.0_101\jre\lib\rt.jar\java\util\ArrayList.class
public void add(int paramInt, E paramE) { rangeCheckForAdd(paramInt); ensureCapacityInternal(this.size + 1); System.arraycopy(this.elementData, paramInt, this.elementData, paramInt + 1, this.size - paramInt); this.elementData[paramInt] = paramE; this.size += 1; }
看源码我们发现System.arraycopy这不就是数组拷贝么。。
我们看下System.arraycopy的参数:
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) Object src:源数组 srcPos:源数组起始位置 Object dest:目标数组 int destPos:目标数组起始位置 int length:要拷贝的长度
我们回头看一下arrayList是如何使用的:
System.arraycopy(this.elementData, paramInt, this.elementData, paramInt + 1, this.size - paramInt); 发现第一个参数与第三个参数是一样的,所以可以说他是拷贝自身; 在看第二个参数与第四个参数发现,paramInt + 1,也就是目标数组的起始位置是源数组起始位置的后一位; 再看this.size - paramInt,this.size是我们list的长度,this.size - paramInt也就是我们从源数组起始位置开始到,最后的长度; 所以可以初步推测出,add(int,obj)是从 int开始后面的所有元素向后移动移位。 接下来我们验证一下。
我写了一个main方法:
public static void main(String[] args) { String[] strs = new String[10]; strs[0]="1"; strs[1]="2"; strs[2]="3"; strs[3]="4"; strs[4]="5"; System.out.print("copy前:"); for (String string : strs) { System.out.print(string+","); } System.out.println(); System.arraycopy(strs, 1, strs, 2, 4); System.out.print("copy后:"); for (String string : strs) { System.out.print(string+","); } }
控制台打印结果:
copy前:1,2,3,4,5,null,null,null,null,null, copy后:1,2,2,3,4,5,null,null,null,null,
发现2,3,4,5这四个元素全部复制一份,向后移动了一位
原来2位置的还是2。
我们在看源码:
this.elementData[paramInt] = paramE; this.size += 1;
把传入的值的赋值在paramInt。
我们把上面的代码稍微改一下:
public static void main(String[] args) { int index=1; String obj = "6"; int size = 5; String[] strs = new String[10]; strs[0]="1"; strs[1]="2"; strs[2]="3"; strs[3]="4"; strs[4]="5"; System.out.print("copy前:"); for (String string : strs) { System.out.print(string+","); } System.out.println(); System.arraycopy(strs, index, strs,index+1, size-index); strs[index] = obj; System.out.print("copy后:"); for (String string : strs) { System.out.print(string+","); } }
控制台打印结果:
copy前:1,2,3,4,5,null,null,null,null,null, copy后:1,6,2,3,4,5,null,null,null,null,
总结一下:arrayList 的add(int,obj)方法,是将从int开始到最后的元素,拷贝一份,放到从int+1开始到最后。直观的效果上看是元素全部向后移动了一位。