本文主要分析JDK1.8中ArrayList的源码,分别将从继承关系、成员变量、构造器、重要方法几个方面展开,这其实也是分析其它类源码的大概思路。
继承关系
1 | public class ArrayList<E> extends AbstractList<E> |
通过IDEA可以查看更完整的继承关系:
- 继承了
AbstractList并实现了List,AbstractList是一个抽象类,定义了一系列增删改查的方法。AbstractList是实现了List了的,为什么ArrayList也要实现List呢?collection 的作者Josh说他写这代码的时候觉得这个会有用处,但是其实并没什么用,但因为没什么影响,就一直留到了现在。 - 实现了
RandomAccess接口:表明ArrayList支持快速(通常是固定时间)随机访问。在ArrayList中,我们可以通过元素的序号快速获取元素对象,这就是快速随机访问。 - 实现了
Cloneable接口:可以使用Object.Clone()方法。 - 实现了
Serializable接口:表明该类的实例可以被序列化。
成员变量
1 |
|
构造器
ArrayList共有3个构造器,都比较简单。
1 | /** |
重要方法
add方法
add方法是ArrayList中重要且常用的一个方法。add方法总共有4个:

add(E e)
add方法主要的执行逻辑如下:
- 计算数组需要的最小大小minCapacity为
size+1。但如果是第一次添加,minCapacity会默认为10 - 如果minCapacity大于elementData数组的长度了,调用grow方法进行扩容。
- 扩容的过程是将数组的长度变为原来的1.5倍,然后将旧数组里的数据复制到新数组。
- 在新数组
size+1的位置存放要添加的元素。
1 | public boolean add(E e) { |
add(int index, E element)
这个方法是添加元素的时候指定了数组的下标index,在index处以及下标大于index处的元素将往后移动一位。
示意图如下:
addAll(Collection<? extends E> c)和addAll(int index, Collection<? extends E> c)
略
get方法
因为ArrayList底层是数组,所以它的get方法非常简单,先是判断一下有没有越界(索引小于0或者大于等于数组实际长度,错误信息返回索引和数组的实际长度),之后就直接通过数组下标来获取元素。
1 |
|
set方法
set方法也比较简单,就是把元素放到数组的指定的index上。
1 |
|