ArrayList的源码分析

本文深入解析ArrayList的实现原理,包括其内部对象数组的初始化过程,以及添加和删除元素时的数组扩容和移动机制。

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

ArrayList继承AbstractList抽象类,根据源码可以知道,内部是一个对象数组,源码如下:

    private static final int DEFAULT_CAPACITY = 10;//默认容量为10
    /**
    *三个对象数组是ArraList根据调用的构造器不同,初始化选择
    */
    private static final Object[] EMPTY_ELEMENTDATA = {};//初始化长度为0的对象数组

    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    
    transient Object[] elementData; // non-private to simplify nested class access
    
    private int size;//ArrayList的大小

定义ArrayList调用不同的构造器时:
1.设置一定大小的构造器:

  public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];//当initialCapacity>0,初始化一个存储集合的缓存区
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;//调用默认为0的数组对象
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

2.空构造器时

public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

3.集合参数的构造器

 public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();//将集合转换为数组格式
        if ((size = elementData.length) != 0) {
            // c.toArray might (incorrectly) not return Object[] (see 6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            // replace with empty array.
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }

添加一个数据时:

   /**
    *在集合末尾添加一个数据
     */
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 目的就是增加对象数组容量,防止数组越界
        elementData[size++] = e;
        return true;
    }

    /**
   * 在指定索引下添加数据
     */
    public void add(int index, E element) {
        if (index > size || index < 0)//添加元素超过集合大小或者小于0时,抛出异常
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
        ensureCapacityInternal(size + 1);  // 增加对象数组容量,防止数组越界
        System.arraycopy(elementData, index, elementData, index + 1,
                         size - index);//将对象数组elementData从index位置开始复制,放到elementData的index + 1位置,即index位置的元素整体后移了以为,这就是ArrayList在插入元素变慢的原因。
        elementData[index] = element;//将元素添加到index
        size++;//集合的大小+1
    }

同理,在移除某个元素时,之后的元素都向前移动一位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值