ArrayList源码分析

本文深入解析ArrayList的工作原理,包括其构造方法、add和get方法的实现细节,以及扩容策略。通过对源码的逐行分析,揭示ArrayList如何在不指定初始容量的情况下高效管理元素。

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

ArrayList 主要集成了List接口,我们还是从我们经常使用来看,这种集合类之所以好用,有一部分原因是我们不必像数组那样, 初始化必须指明了大小。比如 List list=new ArrayList<>();
elementData 属于Object[] 默认置空。也不会做任何操作。

/**
 * Constructs an empty list with an initial capacity of ten.
 */
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

主要分析add和get操作。

  public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        //赋值进去。
        elementData[size++] = e;
        return true;
    }

//初始化的时候实际上size为0.

 private void ensureCapacityInternal(int minCapacity) {
        //跟10比较,选择比较小的那个。等于说小于10的容量选择此容量,大于10的容量就选择10的容量。
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }
   private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

关键是grow方法,进来分析下。

  private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
         //扩容,oldCapacity 的3倍了。
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
            //超过最大的容量。这个容量 Integer.MAX_VALUE - 8;已经超级巨大了。
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        //此操作将原来的数组,复制到新的数组上去。
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

//此操作也是非常简单的。

  public E get(int index) {
        if (index >= size)
            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

        return (E) elementData[index];
    }

//现在有个问题。HashMap也是利用了 数组作为基础的数据结构,那么HashMap是否也可以利用二维数组去描述呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值