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


相关推荐

  • ajaxSubmit上传文件返回结果是下载action文件

    ajaxSubmit上传文件返回结果是下载action文件在ajaxSubmit提交表单的配置里面,增加一个参数,服务器端判断是否是ajaxSubmit提交过来的表单,是的话就返回“text/html”类型的内容,不是就可以返回“application/json”的。publicvoidwrite(Stringmsg,HttpServletResponseresponse)throwsException{PrintWri

    2025年6月7日
    0
  • Group_concat介绍与例子

    Group_concat介绍与例子

    2021年10月18日
    75
  • 除了we tool还有哪些免费安全好用的微信群发软件?这两个软件比we tool好用!

    除了we tool还有哪些免费安全好用的微信群发软件?这两个软件比we tool好用!除了wetool还有哪些安全好用的微信群发软件?群发工具是社群运营使用频率最高的工具,无论是给群内推送消息,还是给个人推送消息。按键精灵:点击左侧链接下载按键精灵是一款模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替您的双手,自动执行一系列鼠标键盘动作。按键精灵免费版简单易用,不需要任何编程知识就可以作出功能强大的脚本。只要您在电脑前用双手可以完成的动作,按键精灵都可以替您完成。按键精灵用途广泛,具有大量脚本资源。简单百宝箱:点击左侧链接下载简单百宝箱是一个绿色和安全的游戏

    2022年6月4日
    92
  • Prometheus TSDB存储原理

    Prometheus TSDB存储原理Python 微信订餐小程序课程视频 https blog csdn net m0 article details Python 实战量化交易理财系统 https blog csdn net m0 article details Prometheus 包含一个存储在本地磁盘的时间序列数据库 同时也支持与远程存储系统集成 比如 grafanacloud 提供的免费云存储 API 只需将 remote write 接口信息填写在 Prome

    2025年7月16日
    0
  • 三期_day12_其它+jetty的使用

    三期_day12_其它+jetty的使用

    2022年2月3日
    40
  • 各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况

    各大免费邮箱邮件群发账户SMTP服务器配置及SMTP发送量限制情况分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程网络产品推广和新闻消息推送时,经常用到的工具就是用客户邮箱发送邮件了,如果是要发送的邮件量非常大的话,一般的建议是搭建自己的邮局服务器,或者是花钱购买专业的邮件群发服务,免费邮箱的SMTP适合少量的邮件群发需求。例如Wordpress的评论邮件通知功能,每天要发送的邮件数量…

    2022年10月3日
    0

发表回复

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

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