java源码阅读--ArrayList

本文详细介绍了ArrayList类的声明、泛型、继承关系及实现的接口。ArrayList内部使用动态数组存储元素,支持快速随机访问,并可实现序列化。文章深入解析了ArrayList的构造方法,包括指定容量和从集合初始化。此外,还阐述了add操作(尾部添加和指定位置插入)以及set和get操作的实现细节,包括动态扩容和元素移动。
摘要由CSDN通过智能技术生成

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)构造一个包含指定元素集合的链表

 

  1. 调用toArray(),将给定集合转成数组;

  2. 让size直接等于给定集合的数组长度;

  3. 判断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);//合法则返回数组对应下标的数值
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值