关于Java面试中的ArrayList底层结构、底层源码的高频热点面试题解析
2023-09-14 09:05:30 时间
目录
一、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,你的支持是对作者最大的鼓励,不足之处可以在评论区多多指正,交流学习
相关文章
- Java实现 LeetCode 面试题 01.07. 旋转矩阵(按照xy轴转+翻转)
- Java实现 LeetCode 面试题62. 圆圈中最后剩下的数字(约瑟夫环)
- Java实现 LeetCode 328 奇偶链表
- Java实现 LeetCode 151 翻转字符串里的单词
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
- java实现第六届蓝桥杯熊怪吃核桃
- java算法集训代码填空题练习1
- Java实现 蓝桥杯VIP 算法训练 采油区域
- Java实现 蓝桥杯VIP 算法训练 筛选号码
- (Java实现) 洛谷 P1319 压缩技术
- 最新最全的Java面试题整理(内附答案)
- java 面试题 -- 线程 按序 交替
- 【Java面试题视频讲解】取近似值
- 计算某一段程序消耗的内存和时间【Java】
- Java面试题 Java中sleep和wait的区别?
- 常见Java面试题 BIO、NIO、AIO 有什么区别?
- 【面试】Java异常面试题
- 【java】Java经典面试题整理(附答案)
- java面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- Java Vertor详细介绍和使用示例
- 时间戳 时区 java mysql
- Java开发之高并发必备篇(二)——线程为什么会不安全?
- java经典面试题之Spring Boot 面试题汇总附答案(史上最全持续更新)
- 经典Java面试100例,轻松搞定BAT——高频面试题(中)