zoukankan      html  css  js  c++  java
  • arraylList.add(int,obj)的底层是怎么样的??

    首先我们查看一下源码是如何的:

    arrayList是在jdk中rt.jar包下的  jdk1.8.0_101jrelib t.jarjavautilArrayList.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开始到最后。直观的效果上看是元素全部向后移动了一位。

  • 相关阅读:
    图的理论基础
    哈夫曼树(三)之 Java详解
    哈夫曼树(二)之 C++详解
    哈夫曼树(一)之 C语言详解
    基数排序
    桶排序
    归并排序
    堆排序
    选择排序
    希尔排序
  • 原文地址:https://www.cnblogs.com/bjsze/p/14190028.html
Copyright © 2011-2022 走看看