集合源码学习1

1、了解集合体系

集合:是一个容器,用来存储数据

2、collection集合特点

有序:存进去的顺序和拿出来的顺序是一样的

ArrayList集合add(E e) 方法的实现

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        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);
    }

这段代码是Java中ArrayList类的一部分,是关于add(E e)方法的实现,以及它如何确保内部数组elementData有足够的容量来存储新元素。

add(E e) 方法

  • 功能:向ArrayList中添加一个新元素e
  • 步骤
    1. 首先,调用ensureCapacityInternal(size + 1)来确保内部数组elementData至少能存储size + 1个元素。这里size是ArrayList中当前元素的数量。ensureCapacityInternal方法会递增modCount,这是一个用于记录结构修改次数的变量,主要用于迭代器的快速失败(fail-fast)机制。
    2. 然后,将新元素e存储在elementData[size]位置,并递增size
    3. 方法返回true,表示添加成功。

ensureCapacityInternal(int minCapacity) 方法

  • 功能:确保内部数组elementData至少能存储minCapacity个元素。
  • 步骤
    • 调用ensureExplicitCapacity(calculateCapacity(elementData, minCapacity))。这里calculateCapacity可能是一个假设的方法,因为标准的ArrayList实现中并没有直接的方法名为calculateCapacity。它的目的是根据当前容量和最小所需容量计算出一个新的容量值,但在这个上下文中,我们可以认为它直接返回了minCapacity
    • ensureExplicitCapacity方法进一步处理容量的增长。

ensureExplicitCapacity(int minCapacity) 方法

  • 功能:确保内部数组elementData至少能存储minCapacity个元素,并递增modCount
  • 步骤
    • 递增modCount
    • 如果minCapacity大于当前数组elementData的长度,则调用grow(minCapacity)来扩容。

grow(int minCapacity) 方法

  • 功能:根据minCapacity扩容内部数组elementData
  • 步骤
    • 计算新的容量newCapacity,通常是将旧容量oldCapacity增加一半(oldCapacity + (oldCapacity >> 1))。
    • 如果newCapacity小于minCapacity,则将newCapacity设置为minCapacity
    • 检查newCapacity是否超过了数组的最大允许大小MAX_ARRAY_SIZE,如果是,则调用hugeCapacity(minCapacity)来处理大容量的情况(可能涉及到将ArrayList转换为基于其他数据结构的实现,但这在标准的ArrayList实现中不是必需的,因为MAX_ARRAY_SIZE足够大,通常是Integer.MAX_VALUE - 8)。
    • 使用Arrays.copyOf(elementData, newCapacity)创建一个新的数组,并将旧数组的内容复制到新数组中,然后将elementData引用指向这个新数组。

这段代码展示了ArrayList如何在添加元素时动态地管理其内部数组的大小,以确保足够的容量来存储新元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值