今日份源码——ArrayList

ArrayList原理解读

ArrayList基本数据结构

15253776-3545df1fbf2e00fc.png

源码基本结构

15253776-11eaf2a0a9be7e72.png

我们看到,有好多个空数组,可见,ArrayList中是用数组来存储数据的。那这些数组是怎么用的呢?继续看

几个典型的方法分析

1、判断包含某个值,可是逐个按下标遍历数组数据

15253776-86f2e1e0f9cd972c.png
15253776-d1f2633fd47860ae.png

遍历elementData数组,逐个取值进行匹配判断

indexOf(o) 返回的是o元素第一次出现的index——数组下标

2、从后往前遍历,查找o最后出现的位置index,下标从大到小遍历数组

15253776-0d476921f3bfbe3d.png

4、含有一个clone方法,实则是将elementData数组数据拷贝

15253776-816ab72267333507.png

测试方法

15253776-973c5d9893b8b64e.png

5、可以直接转成一个数组

15253776-973bb47cdfd812b4.png
15253776-d345ee940e3c11ff.png
注意长度

使用方法

15253776-a19b1671610cbcb4.png
15253776-ea96bffb36dd9987.png

6、获取数据

15253776-05d153a4de1d640e.png

检查下标大小

15253776-7451aa912d6d5158.png
直接读取下标数据,非常迅速

直接由数组下标读取值时间复杂度O(1)

7、添加数据

15253776-72548a3bf2435cbd.png
size是实际存储的数据的个数(有别于数组容量)
15253776-8b063b48279bd3c4.png
扩容、迁移判断
15253776-7b0b37ea41bd7955.png
grow方法牵扯数组扩容、数据迁移

扩容是原容量的1.5倍扩容(在使用ArrayList时,如果大致知道数值个数,初始化时给出容量是最好的)

判断是否需要扩容、迁移

添加新数据到数组

基础分析到此

猜你喜欢

转载自blog.csdn.net/weixin_34153893/article/details/87411099