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 的底层如何实现  啊  好累啊        如需让我补充  敬请评论 互相交流学习

之后源码的方法 ,也就是封装的方法,增加删除等等。 

我就不过多介绍了   大家再见!!!

 

版权声明:本文为q-233原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/q-233/p/15107602.html