ArrayList的类声明
public class ArrayList<E> extends <E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public表示该类为公共的;
“<E>”为泛型,可以理解为ArrayList放的元素的类型;
ArrayList<E> extends <E>表示ArratList继承了AbstractList类,AbstractList类为抽象类,通过AbstractList可以实现接口中一些通用的方法;
implements后为其实现的4个接口List<E>, RandomAccess, Cloneable, java.io.Serializable:
List<E>接口:通过AbstractList类我们可以得知其也实现了List<E>的接口,此处为什么再次实现该接口,在各处文献中均存在一些争论;
RandomAccess接口:标记性接口,通过查看api文档,作用是快速随机存取;
Cloneable接口:实现了该接口以便使用Object.Clone()中的方法;
Serializable接口:实现该序列化接口,表明该类可以被序列化,序列化即能从类变成字节流传输,还能从字节流变成原来的类;
成员
@java.io.Serial
private static final long serialVersionUID = 8683452581122892189L;//版本号
private static final int DEFAULT_CAPACITY = 10;//默认初始化容量
private static final Object[] EMPTY_ELEMENTDATA = {};//用于空实例的共享空数组实例
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/* 用于默认大小的空实例的共享空数组实例。我们将其与 EMPTY_ELEMENTDATA区分开来,以了解添加第一个元素时要膨胀多少。*/
transient Object[] elementData;
/*存储 ArrayList 元素的数组缓冲区,以简化嵌套类访问当添加第一个元素时,任何具有elementData ==DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展为DEFAULT_CAPACITY*/
private int size;//数组的大小(元素的个数)
构造
1)构造了一个指定大小但内容为空的链表
构造一个具有指定初始容量的空列表-----通过if语句来对传入的参数进行判断,从而确定构造的数组的大小;
若输入为负参数输出如图:
2)构造一个包含指定元素集合的链表
-
调用toArray(),将给定集合转成数组;
-
让size直接等于给定集合的数组长度;
-
判断size,如果为0则直接创建空存储实例,否则使用Arrays.copyOf将给定集合数组复制一份(浅拷贝),作为存储数组;
3)构造空列表
构造一个初始容量为DEFAULT_CAPACITY=10的空列表
add操作
1)直接在队尾添加元素
上图中add(e, elementData, size)函数如下图:
此函数完成三个步骤,分别是:扩容、赋值、修改数组大小;
且此图中add前为private;
2)在指定位置添加元素
此段代码的功能为:在此列表中的指定位置插入指定元素。将当前位于该位置的元素(如果有)和任何后续元素向右移动(将其索引加一);
rangeCheckForAdd()检查索引index是否超出数组的大小,中间的if判断语句可以实现动态扩容,然后通过System.arraycopy()对数组进行复制来实现后续元素的右移,最后在索引index的位置上放上元素,修改数组大小;
set操作
public E set(int index, E element) {
Objects.checkIndex(index, size);//检查下标是否符合范围
checkForComodification();
E oldValue = root.elementData(offset + index);//获取对象,赋值
root.elementData[offset + index] = element;
return oldValue;
}
get操作
public E get(int index) {
Objects.checkIndex(index, size);//检查下标是否合法
checkForComodification();
return root.elementData(offset + index);//合法则返回数组对应下标的数值
}