Java ArrayList源码阅读笔记(基于JDK17)
虽然不喜欢看源码,但是据说会让人变强啊,看别的大佬的代码也许才知道怎么处理自己的一坨吧,因此冒着秃顶的风险还是来看看吧。。。
第一遍先简单看看吧,搞不清楚的地方也许会在遥远的将来再复习下吧
1、简介
其实在搞不清楚这玩意儿究竟是什么的情况下,已经稀里糊涂地用它写了好多代码了,而且每当找不到数据结构的时候,口袋里一摸就是ArrayList
,所以它到底是个啥?
ArrayList
类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素
ArrayList
继承了 AbstractList
,并实现了 List
接口
以上便是比较标准的定义,大概就是一个特殊的数组,可以方便地变大变小
2、类图及类定义
ArrayList
继承自AbstractList
类,实现了List
、RandomAccess
、Cloneable
、java.io.Serializable
接口
- List接口:表明它是一个有序列表,支持添加、删除、查找等操作,并且可以通过下标进行访问
- RandomAccess接口:标记接口,表明实现这个接口的List支持快速随机访问,即直接通过索引下标访问列表的元素
- Cloneable接口:表明支持拷贝操作,支持深拷贝或浅拷贝操作
- java.io.Serializable接口:表明支持序列化操作,可以将对象转换为字节流进行持久化存储或网络传输,非常方便
3、扩容机制
这块经常会被提到,并且所谓“动态”指的也就是这个机制,是该数据结构设计的关键
3.1、构造函数
要看ArrayList
怎样进行扩容,那么自然绕不开创建类的实例
以下两个常量,其中DEFAULT_CAPACITY
表示创建ArrayList
默认的初始容量10,而EMPTY_ELEMENTDATA
表示的是一个空数组,这是一个共享的空对象数组
// 默认的初始容量
private static final int DEFAULT_CAPACITY = 10;
// 共享的空数组实例
private static final Object[] EMPTY_ELEMENTDATA = {
};
在ArrayList
中,有3个构造函数:
ArrayList()
ArrayList(int initialCapacity)
ArrayList(Collection<? extends E> c)
ArrayList()
是无参构造,默认会创建一个空对象数组,在第一次添加元素时会扩容到容量10
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
ArrayList(int initialCapacity)
构造函数需要指定一个初始容量,依据给定的初始容量的大小,创建不同长度的对象数组,或是抛出异常
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
// 初始容量大于0
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
// 创建空数组
this.elementData = EMPTY_ELEMENTDATA