(目录) 一、ArrayList的底层结构 ArrayList实现了 List 接口 ArrayList:底层数据结构是数组,特点是查询快,增删慢 二、ArrayList的底层源码分析 面试热点问题 (1)ArrayList底层是什么数据结构?
(目录)
一、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 ,然后不要小数部分