[源码分析]ArrayList

add

 public boolean add(E e) {
        //先确保数组容量
        ensureCapacityInternal(size + 1);
        //直接将值放在size位置
        elementData[size++] = e;
        return true;
    }

     private void ensureCapacityInternal(int minCapacity) {
       //如果刚开始为空,并且 容量小于默认容量,则初始化 默认容量 (10)
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        //校验是否需要扩容
        ensureExplicitCapacity(minCapacity);
    }

    private void ensureExplicitCapacity(int minCapacity) {
        //一定要修改modCount
        modCount++;

        //  当容量大于当前元素条数,需要扩容
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }

    private void grow(int minCapacity) {
        // 旧容量
        int oldCapacity = elementData.length;
        //新容量 = 旧容量 + 旧容量 * 2;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果新容量还是小于需要的容量大小,则采用传入的minCapacity
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        //如果minCapacity太大,还需要修正
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        //最后使用Arrays.copyOf 方法扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        //使用 Integer.MAX_VALUE
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

remove

 public E remove(int index) {
        rangeCheck(index);

        modCount++;
        //先获取该索引位置的值
        E oldValue = elementData(index);
        //找到需要复制的元素个数    a b c d e f (如果要删除 d,索引是3  6 - 3 -1 = 2)
        int numMoved = size - index - 1;
        //将后边的元素拷贝到被删除的索引的位置
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        //最后一位置为 null
        elementData[--size] = null; // clear to let GC do its work

        return oldValue;
    }

get

 E elementData(int index) {
        return (E) elementData[index];
     }
posted @   丶Pz  阅读(124)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
历史上的今天:
2017-02-22 ElasticSearch 【仿】博客园找找看页面搜索实现
点击右上角即可分享
微信分享提示

目录

目录

X
+

"大爷常来玩呀"

微信支付