今天开始学习ArrayList源码(以后所有源码都在jdk1.13上分析)。学习源码肯定要带着问题来学的,要不漫无目的就不是学习,是浪费时间。
一般我们都有以下几个问题:
- ArrayList底层是什么数据结构?
- ArrayList如何实现自动扩容?
- ArrayList优缺点是什么?
- ArrayList面试中有哪些考点?
- ArrayList工作中用在什么场景?
今天我们先解决第一个问题:ArrayList底层是什么数据结构?
先创建一个ArrayList。
ArrayList arrayList = new ArrayList();
进去看ArrayList()这个构造函数,如下:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
这时候我们应该想到2个问题:
- elementData 是啥?
- DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是啥?
继续看
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = new Object[0];
transient Object[] elementData;
原来 elementData 是个数组对象!(用transient关键字标记的成员变量不参与序列化过程)
而 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 就是创建一个空洞数组!
那么,我们知道了,这个ArrayList构造函数只是创建一个空数组!
再看看另外的构造函数,只是创建传进来大小的数组,或者复制传进来的集合,就这么简单。


所以,到现在我们知道了,ArrayList底层数据结构实际就是一个数组!
网友评论