Android开发Android技术知识

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.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 填充(如有必要),以使副本具有指定的长度。

上一篇下一篇

猜你喜欢

热点阅读