ArrayList扩容机制。

ArrayList扩容机制。1)直接new一个ArrayList对象时(未指定初始容量大小)是一个空的数组,容量大小为零。publicArrayList(){//DEFAULTCAPACITY_EMPTY_ELEMENTDATA变量为一个空的数组privatestaticfinalObject[]DEFAULTCAPACITY_EMPTY…

大家好,又见面了,我是你们的朋友全栈君。

    
    1)直接new 一个ArrayList对象时(未指定初始容量大小)是一个空的数组,容量大小为零。
    
    
    public ArrayList() {

        // DEFAULTCAPACITY_EMPTY_ELEMENTDATA 变量为一个空的数组 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    
    2)、当第一次调用ArrayList对象的add方法时,分配容量大小
    public boolean add(E e) {

        // size 为ArrayList的实际数量大小而非容量大小,如果未指定容量构建的ArrayList对象此时size对象应该为0
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
    
    private void ensureCapacityInternal(int minCapacity) {

        // 如果为空数组,最小需要容量为默认最小容量DEFAULT_CAPACITY 也就是10 private static final int DEFAULT_CAPACITY = 10;
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {

            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        // 调用扩容方法
        ensureExplicitCapacity(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;
        // 第一次扩容1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        // 还是比需要的容量小就把需要的容量作为新的容量值
        if (newCapacity – minCapacity < 0)
            newCapacity = minCapacity;
        // 如果此时的新的容量比最大容量还大则比较需求容量和数组最大容量的大小,
        如果比最大容量大就赋值为整数最大值,反之赋值为最大容量。
        这里主要防止1.5倍扩容导致新容量值超过数组最大容量
        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;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141769.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 飞机订票系统测试用例

    飞机订票系统测试用例1、登录界面的标题为“航班预订登录界面”;2、代理名称由4位或者以上的字母和数字组成,不超过8位,不能由纯数字组成或者数字开头,否则系统提示给出相应的提示“代理名称不能由纯数字组成,请重新输入”或“代理名称不能由数字开头,请重新输入”。代理名称长度小于4位时,点击确认按钮,系统弹出提示对话框提示“代理名称长度必须至少为4个字符,请重新输入”;代理名称长度大于8位时,点击确认按钮,系统弹出提

    2022年6月17日
    57
  • datagrip 2.4 激活_最新在线免费激活

    (datagrip 2.4 激活)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月29日
    126
  • Vue.js 快速入门

    Vue.js 快速入门

    2022年2月21日
    35
  • 使用云服务器不得不知的操作禁忌

    使用云服务器不得不知的操作禁忌

    2021年10月8日
    307
  • spring boot的自动配置原理_springboot的工作原理

    spring boot的自动配置原理_springboot的工作原理深入Springboot启动流程+自动配置原理?写在前面?相关常见面试题Springboot启动入口@SpringBootConfiguration解读@ComponentScan解读@EnableAutoConfiguration解读(重点)@AutoConfigurationPackage解读@Import({AutoConfigurationImportSelector.class})解读(重点)?写在前面?自从SpringBoot问世以来,开发界可以说是乱了套。我还记得我朋友几年前去参加

    2022年8月20日
    3
  • Iscsiadm解析

    Iscsiadm解析1.#iscsiadm-mdiscovery-tst-p192.168.4.109:3260发现新增target-m模式discovery-t类型(iSCSI3discoverytypes:SendTargets,SLP,andiSNS)-T目标名称stsendtargets发送目标-p…

    2022年8月23日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号