Java面试中ArrayList底层结构和源码,你能详细解析一下吗?

2026-04-12 04:011阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计472个文字,预计阅读时间需要2分钟。

Java面试中ArrayList底层结构和源码,你能详细解析一下吗?

(目录)一、ArrayList的底层结构+ArrayList实现了List接口+ArrayList:底层数据结构是数组,特点是查询快,增删慢

二、ArrayList的底层源码分析+面试热点问题

Java面试中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 ,然后不要小数部分


作者:KJ.JK

本文共计472个文字,预计阅读时间需要2分钟。

Java面试中ArrayList底层结构和源码,你能详细解析一下吗?

(目录)一、ArrayList的底层结构+ArrayList实现了List接口+ArrayList:底层数据结构是数组,特点是查询快,增删慢

二、ArrayList的底层源码分析+面试热点问题

Java面试中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 ,然后不要小数部分


作者:KJ.JK