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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python的缩进规则是什么意思_python缩进规则叫什么

    python的缩进规则是什么意思_python缩进规则叫什么Python 中的缩进 Indentation 决定了代码的作用域范围 这一点和传统的 c c 有很大的不同 传统的 c c 使用花括号花括号 符决定作用域的范围 python 使用缩进空格来表示作用域的范围 相同缩进行的代码是处于同一范围 每行代码中开头的空格数 whitespace 用于计算该行代码的缩进级别 Indentationl 注意一个 Tab 会被替换为 1 8 个 Space 具

    2025年10月19日
    3
  • linux c——dup( )和dup2( )函数详解

    dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下。1、dup函数头文件及函数定义:#include&amp;lt;unistd.h&amp;gt;intdup(intoldfd);dup用来复制参数oldfd所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符,若有错误则返回-1.错误代码存入errno中…

    2022年4月4日
    155
  • 自动化运维架构体系

    自动化运维架构体系转载于:https://www.cnblogs.com/xinghen1216/p/8493580.html

    2022年7月17日
    13
  • NTP 协议介绍_什么是UTC协议

    NTP 协议介绍_什么是UTC协议NTP协议NTP(NetworkTimeProtocol,网络时间协议)是由RFC1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。NTP基于UDP报文进行传输,使用的UDP端口号为123。使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。对于运行NTP的本地系统,既可以接收来…

    2022年10月12日
    3
  • ThreadPoolExecutor的keepAliveTime=0说明

    点击上方☝,轻松关注!及时获取有趣有料的技术文章如题,如下图,解释ThreadPoolExecutor的keepAliveTime=0。上图来自《并发编程的艺术》一书,书中有下面一段描…

    2022年3月1日
    84
  • Mysql decimal(m,d)的说明

    Mysql decimal(m,d)的说明看了一些博客,觉得很多都是复制的,不如自己亲测一篇:createtabledecimal_test(idintauto_incrementPRIMARYkey,scoredecimal(5,2)–取值范围是-999.99到999.99);–整数的位数必须小于等于m-d,不然报错。小数的位数可以大于d位。多…

    2022年7月17日
    20

发表回复

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

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