ArrayList局部源码分析
2017-04-11 本文已影响0人
AppLLM
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.pngDEFAULT_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.pngmodCount++:
对修改次数的计算
minCapacity - elementData.length > 0
:当前所需最小容量>当前数组的空间长度;如果条件成立就会进行数组扩容
可以看到,ensureCapacityInternal(size+1)
和ensureExplicitCapacity(minCapacity)
只是对一些条件的做了判断,正真的扩容在grow(minCapacity)
,这也是核心部分
Part5:
说明:帮助ArrayList动态扩容的核心方法
arraylist5.png源码解析:计算赋予elementData新的长度,结束后elementData的数据被复制到新的内存空间
Array.copyOf(T[] original, int newLength)
:
复制指定的数组,截取或用 null 填充(如有必要),以使副本具有指定的长度。