ArrayList局部源码分析

作者: AppLLM | 来源:发表于2017-04-11 17:18 被阅读0次

    ArrayList 部分代码:

    ArrayList源码(add()局部)
    http://www.jianshu.com/p/ea602773e377

    本文仅针对java 1.8源码进行分析

    以下代码是最简单的代码,当运行时,ArrayList的内部发生了什么,下面简单分析一下,通过对add()方法的运行过程来简单了解ArrayList的内部结构;

    ArrayList al=new ArrayList();
    al.add(1);
    

    Part0:

    成员变量

    说明:我们先看看我们需要用到ArrayList的成员变量有哪些

    arraylist0.png
    DEFAULT_CAPACITY:默认的容量

    elementData:这个就是ArrayList中的数组,所有对ArrayList的操作实际上是对该数组的操作,不可序列化

    DEFAULTCAPACITY_EMPTY_ELEMENTDATA:字面意思就是一个空的数组,无参构造函数创建的数组

    size:表示ArrayList的元素个数,并不是elementData的空间长度,arraylist.size()获取的就是这个值

    Part1:

    说明:ArrayList创建一个新的对象,调用无参构造函数

    arraylist1.png

    源码解释:调用构造函数,将DEFAULTCAPACITY_EMPTY_ELEMENTDATA赋给elementData;
    就是将ArrayList的数组进行初始化

    Part2:

    说明:添加一个元素

    arraylist2.png
    源码解释:这里只有2句代码,第一句的作用是对数组进行检测扩容,第二句就是赋值操作
    ensureCapacityInternal(size+1):
    当size+1后对数组进行检测,如果size+1>elementData.length(),也就是说添加一个元素后数组已经放不下了,就会扩大数组的容量;
    elementData[size++] = e
    arraylist的末尾,确切地说是数组已赋值的长度的后一个下标赋值e;

    下面我们看看ensureCapacityInternal(size+1)到底做了什么

    Part3:

    说明:得到最小扩容量

    arraylist3.png

    源码解释:该方法中只对数组进行判断是否是无参构造函数构建的空数组,如果是,则将数组取数组的默认容量值DEFAULT_CAPACITY付给minCapacity,后面会根据minCapacity对数组进行扩容

    再进入ensureExplicitCapacity(minCapacity)

    Part4:

    说明:判断是否需要扩容

    arraylist4.png

    modCount++:对修改次数的计算

    minCapacity - elementData.length > 0:当前所需最小容量>当前数组的空间长度;如果条件成立就会进行数组扩容

    可以看到,ensureCapacityInternal(size+1)ensureExplicitCapacity(minCapacity)只是对一些条件的做了判断,正真的扩容在grow(minCapacity),这也是核心部分

    Part5:

    说明:帮助ArrayList动态扩容的核心方法

    arraylist5.png

    源码解析:计算赋予elementData新的长度,结束后elementData的数据被复制到新的内存空间

    Array.copyOf(T[] original, int newLength):
    复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。

    相关文章

      网友评论

        本文标题:ArrayList局部源码分析

        本文链接:https://www.haomeiwen.com/subject/kbsuattx.html