一、ArrayList的底层结构
ArrayList实现了 "List" 接口
ArrayList:底层数据结构是"数组",特点是"查询快,增删慢"
二、ArrayList的底层源码分析
面试热点问题
(1)ArrayList底层是什么数据结构?
ArrayList底层是一个Object数组: "transient Object[] elementData;"
(2)底层的数组的初始化长度是多少?
使用"无参构造方法创建集合"时,数组的初始长度为 0
使用"带参构造方法创建集合"时,数组长度由参数值指定
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; //this.elementData={};
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
(3)首次调用add方法添加元素的时候,数组的长度变为多少?
如果"初始化的数组长度为0","首次添加元素"时,长度会扩容为"10"
elementData=grow(); //grow();长度不够时会自动增长
(4)如果添加的元素超过数组长度,怎么办?
数组会"自动扩容",长度在"原来的基础上增加一半"
int oldCapacity= elementData.length;
int newCapacity= oldCapacity+(oldCapacity>>1) >>1相当于除以2 (右移1位)
//注意:每一次发现现有的数组装不下,都会再次扩容一个1.5倍大小的新数组 (原来的基础上增加一半)
新数组的长度 = 旧数组的长度+ 旧数组长度/2(直接舍弃小数部分)
22 = 15 + 7
(15/2=7.5)
//可以这样子记,新数组长度 = 旧数组长度*1.5 ,然后不要小数部分
作者:KJ.JK
本文仅用于交流学习,未经作者允许,禁止转载,更勿做其他用途,违者必究。
文章对你有所帮助的话,欢迎给个赞或者 star,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习