ArrayList源码解析

本文详细解析了ArrayList的源码,包括ArrayList的属性、构造函数、添加、移除、查询和更新元素的方法,以及fail-fast机制。ArrayList是基于数组实现的List接口实现类,线程不安全但查询和修改效率高。文章还介绍了ArrayList的迭代器和子列表操作,以及并发修改异常产生的原因和fail-fast机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList源码解析

简介

​ 特点:ArrayList是List接口的主要实现类,它存储有序的,可重复的数据。

​ 优缺点:ArrayList线程不安全,但其查询、修改数据的效率高。

​ 底层原理:ArrayList底层是基于数组来实现的。

Arraylist的继承与实现

ArrayList的类图(该图由Idea自动生成)

在这里插入图片描述
从上图可知,ArrayList继承了AbstractList,实现了Serializable、RandomAccess、Cloneable、List。

功能:

  • 继承AbstractList类,实现了List接口。它是一个抽象类,实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换
  • 实现Cloneable接口,重写了函数clone(),可以被克隆。
  • 实现RandomAccess接口,提供了随机访问功能。
  • 实现了Serializable接口,因此,ArrayList支持序列化,可以将对象转换为可保持或可传输的过程。

源码解析

本文将从ArrayList使用的角度解析源码

ArrayList属性

在阅读源码前,我们需要先理解一些ArrayList属性代表的含义

	// 数组默认的初始容量为10
    private static final int DEFAULT_CAPACITY = 10;

	// 空的Object数组
    private static final Object[] EMPTY_ELEMENTDATA = {
   };

	// 空的Object数组,将其与上面的区分开来,EMPTY_ELEMENTDATA用于有参构造函数且参数为0时,而DEFAULTCAPACITY_EMPTY_ELEMENTDATA用于无参构造函数。
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
   };

	// 集合中存放数据的对象,ArrayList的核心
    transient Object[] elementData; 

	// 集合内数据的大小,size初始为0
    private int size;

	// modCount继承于AbstractList,用于记录数组的添加、删除操作次数

创建ArrayList对象

  1. 使用无参构造函数创建对象

    ArrayList arr = new ArrayList();
    

    在Idea中使用Ctrl+鼠标左键单击,可以进入ArrayList.java中查看源码。

    // 可以看出,创建了一个elementData的长度为0的ArrayList对象
    public ArrayList() {
         
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    
  2. 使用有参构造函数创建对象,参数的类型为int。

    // 创建一个长度为initialCapacity的elementData数组
    public ArrayList(int initialCapacity) {
         
        // 如果初始容量长度大于0,则从新创建一个Object数组
        if (initialCapacity > 0) {
         
            this.elementData = new Object[initialCapacity];
        // 否则如果初始容量为0,则将EMPTY_ELEMENTDATA的地址赋给elementData。  
        } else if (initialCapacity == 0) {
         
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
         
        // 否则抛出异常    
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    
  3. 使用有参构造函数创建对象,参数的类型为Collection。

    // 使用这种方式创建ArrayList对象,会将Collection对象转为Object数组,然后将其拷贝给elementData数组
    public ArrayList(Collection<? extends E> c) {
         
        // 将Collection对象转为数组
        Object[] a = c.toArray();
        // 将b数组的长度赋值给size,判断其是否不等于0
        if ((size = a.length) != 0) {
         
            if (c.getClass() == ArrayList.class) {
         
                // 将a的地址赋给elementData
                elementData =</
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值