ArrayList底层数据结构介绍
2022-05-22 本文已影响0人
小小土豆dev
ArrayList
ArrayList底层是采用数组来进行数据的存储。

- DEFAULT_CAPACITY:ArrayList初始大小是10
- EMPTY_ELEMENTDATA:ArrayList的初始化数组,用来初始化elementData
- elementData:ArrayList的底层数组,是一个Object类型数组
- size:ArrayList大小
初始化大小
1、ArrayList通过无惨构造函数初始化的容量是0。

2、通过有参构造函数初始化的容量是参数的容量大小

ArrayList扩容机制
一:add操作扩容规则
1、空集合第一次add操作会触发首次扩容,扩容大小是10。
2、如果新add的元素超过ArrayList的容量,比如,添加第11个元素,扩容1.5倍(后面每次扩容是上次容量的1.5倍,如果1.5倍存在小数问题怎么解决,实际底层是通过右移一位来实现扩容1.5倍)
扩容是用新数组代替旧数组,指针指向新的数组的地址,旧的数组下次垃圾回收会进行回收。(创建一个新的数组,然后将旧数据copy过来,然后再追加新的元素)
grow是扩容方法


二:addAll操作扩容规则
1、一个空的集合第一次添加一个新的集合
- 如果添加的元素没有超过10,默认扩容是10。
-
如果超过10,默认是添加的元素的个数。
2、非空集合添加元素
- 如果添加的元素没有超过1.5倍,则扩容1.5倍。
-
如果超过了1.5倍,数组大小 = 数组当前元素个数+新增元素个数。