zoukankan      html  css  js  c++  java
  • ArrayList动态扩容

    1、ArrayList 的内部实现是一个 Object 数组,当该 ArrayList 的 size 到达当前的容量最大值后,再插入数据就会触发扩容。

    2、当使用构造器:public ArrayList() 构造的话,此时ArrayList的容量为0,直到插入了第一条数据,才使用 DEFAULT_CAPACITY(默认容量)=10。

    3、扩容函数:

    //传参为所需要的最小容量,如果是调用add()触发的话,那参数肯定是size+1
    private void grow(int minCapacity) {
        //旧的容量
        int oldCapacity = elementData.length;
        //新的容量采用位移运算,大约等于旧的容量的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        //如果新的容量还是不够用的话(如果是调用add()触发的话,肯定不会不够用的)
        if (newCapacity - minCapacity < 0)
            //直接让新的容量 = 所需要的最小容量
            newCapacity = minCapacity;
        //如果新的容量大于ArrayList所允许的最大容量
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            //???
            newCapacity = hugeCapacity(minCapacity);
        //最后用数据复制的方式完成扩容
        elementData = Arrays.copyOf(elementData, newCapacity);
    }        
    

    4、同样的,此类非线程安全的集合类会涉及到 Fail-Fast 机制:

      内部一个 volatile 类型的 modCount 变量,对内容的修改都将++这个值,并且修改器会判断 modCount 跟 expectedModCount 是否相等,如果不相等就表示已经有其他线程修改了。

    参考:https://zhuanlan.zhihu.com/p/37500957

  • 相关阅读:
    CodeForces
    CodeForces-1253B(贪心+模拟)
    WebFlux、Reactive编程特性
    redis-on-windows配置解释
    SpringBoot配置方式补充
    如何在 Ubuntu 20.04 上安装 Python Pip
    MySQL之1055错误
    CuckooSandbox
    Manjaro 20.0.1 Lysia 安装Googlepinyin
    Manjaro 20.0.1 Lysia 更新国内镜像源
  • 原文地址:https://www.cnblogs.com/LinsenLi/p/10481535.html
Copyright © 2011-2022 走看看