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开始到最后。直观的效果上看是元素全部向后移动了一位。

 

 

posted @ 2020-12-25 17:27  xiaobaitu88  阅读(208)  评论(0编辑  收藏  举报