ArrayList 源码底层实现解析 基于1.8
ArrayList 介绍
ArrayList是一种线性数据结构,它的底层是用数组实现的,是动态数组。与Java中的数组相比,它的容量能动态增长。源代码里有解释。当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找的优势的基础上,弥补了数组在创建后,要往数组添加元素的弊端。好了不说太多,咱们的目标是源码实现。往下看。。。
底层实现:
ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。
ArrayList 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。在ArrayList中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。稍后,我们会比较List的“快速随机访问”和“通过Iterator迭代器访问”的效率。
ArrayList 实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
ArrayList 实现java.io.Serializable接口,这意味着ArrayList支持序列化,能通过序列化去传输。
直接上源码 下图一步一步解析
我们只需记住该默认容量的大小为 10 即可
上图是共享的空数组实例用于默认大小的空实例。我们将其与EMPTY_ELEMENTDATA区分开来,以便知道添加第一个元素时要膨胀多少。
数组有下标的概念,默认大小是10 的情况下,它的下标就是 0 – 9.
这里定义的动态就是ArrayList的优势,所以它才会在有数组优点的基础上,又是可变大小。
每添加一个元素,这里的size 就会++, +1 操作; size 就代表当前的元素数量。
这两个为一部分 ,没截图完整。
minCapacity—期望的最小容量,这里才发现表示的是期望容量!!!
上述注释的意思为增加容量,以确保它至少能容纳由最小容量参数指定的元素数量。
这个函数就表示了为什么扩容机制为1.5倍,再接着看
这个函数表示了巨大的容量 传入了一个你期望的容量,经过判断 如果容量为 0 就抛出内存异常
接着又是三目运算符,条件为如果期望容量大于Array的最大值 这个表达式为true 就返回Integer 的最大值 否则返回Array长度的最大值。
到现在就解析完成了ArrayList 的底层如何实现 啊 好累啊 如需让我补充 敬请评论 互相交流学习
之后源码的方法 ,也就是封装的方法,增加删除等等。
我就不过多介绍了 大家再见!!!