arrayList 实现原理

ArrayList 源码

1,查看初始化方法

image-20210624095253403

2,给数组对象初始化

image-20210624095331894

image-20210624095354959

3,查看add(E)处理

image-20210624095447990

4,ensureCapacityInternal() 这个方法主要是处理数组的动态扩容

image-20210624095723799

5,calculateCapacity() 主要是数组的长度

image-20210624100608554

6,判断数组是否是初始化的对象, 如果是,在判断是默认的长度大,还是数组的长度大,采用最大的值作为数组的长度

如果不是初始化的对象,那么直接返回当前长度。

image-20210624100712573

7,判断数组是否需要动态扩容的方法

image-20210624100847652

8,判断当前的length - arrayList对象的length 是否大于 0

​ 大于0 说明需要扩容

​ 小于等于0不处理

image-20210624101140495

9,grow() 数组扩容的处理方法

image-20210624101323829

10,Arrays.cooyOf()扩容数组

private void grow(int minCapacity) {
    // overflow-conscious code
    // oldCapacity 就是 当前数组的 length
    // 比如 oldCapacity 是16
    int oldCapacity = elementData.length;
    // newCapacity = oldCapacity + (oldCapacity * 0.5)
    // 24 = 16 + (16 * 0.5)
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 判断 新的长度 - 当前长度 < 0 就继续使用当前长度
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    // 判断 新长度 - 数组最大长度 > 0 就使用 int 的最大值 否则 使用 MAX_ARRAY_SIZE的值
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    // copy 原数组生成新数组
    elementData = Arrays.copyOf(elementData, newCapacity);
}

image-20210624105537171

image-20210624101411132

image-20210719134707964

// original 原数组
// newLength 新数组长度
public static <T> T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    @SuppressWarnings("unchecked")
    // 判断泛型是不是 Object 对象
    // 是的 Object 的情况下通过 new Object[length] 构建新数组
    // 不是的情况下通过 getComponentType() 获取数组对象的数据类型, 新数组长度构建数组
    // int[].getComponentType() == 'int'
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    // 原数组 开始复制下标 新数组 复制值的下标 复制数组长度 
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值