ArrayList源码

add方法#

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

// 添加元素
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // 确保数组容量足够添加
    elementData[size++] = e;
    return true;
}

调用add方法往ArrayList中添加元素时,整体分为两个步骤:1、确保有足够的容量;2、把元素添加进去;所以这里的重点就是第一步了。

// 确认内置容量
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 计算容量
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

ensureCapacityInternal方法又分为两步,1、计算容量;2、确保容量足够;

calculateCapacity计算容量,如果是调用了ArrayList的无参构造方法的话,使用的就是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,所以就会拿默认容量DEFAULT_CAPACITY和传进来的minCapacity进行比较,选择较大值作为新容量。

如果创建ArrayList时传入了容量,那么这里就是数组容量加1了。

// 确保显示容量
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

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

ensureExplicitCapacity方法中首先执行了一个modCount++,这个的目的是防止并发修改,数组容量每次发生修改都要修改这个值,然后和expectedModCount进行比较,如果不一致就会触发异常。

先判断一下数组现在的容量是否小于需要的容量,如果是的会就需要扩容了,否则容量足够就不用执行操作,直接把数据存进去就行了。

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;  // 获取现在的容量
    int newCapacity = oldCapacity + (oldCapacity >> 1);  // 扩容 变为1.5倍
    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);
}
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

作者:Bright丶

出处:https://www.cnblogs.com/muoying/p/17596150.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   陌影~  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示