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;
    }

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • laravel 表迁移报错[通俗易懂]

    laravel 表迁移报错[通俗易懂]laravel 表迁移报错

  • docker镜像导入导出_导出docker镜像

    docker镜像导入导出_导出docker镜像简介当服务器无法访问公网的时候,又要pull镜像,这个时候可以将其他服务上的镜像导出,然后再导入到要用的服务器。方法一:1.保存save-加载load格式:dockersaveIMAGE(镜像)使用dockerimages查看本机已有的镜像(也可以使用dockercommit命令把一个正在运行的容器保存为镜像),如:导出:格式:dockersaveimagesID>/存放位置/打包文件名.tardockersave42cdba9f1b08

  • list,tensor,numpy相互转化

    list,tensor,numpy相互转化1.1list转numpyndarray=np.array(list)1.2numpy转listlist=ndarray.tolist()2.1list转torch.Tensortensor=torch.Tensor(list)2.2torch.Tensor转list先转numpy,后转listlist=tenso…

    2022年10月19日
  • mysql 外键(foreign key)的详解和实例「建议收藏」

    mysql 外键(foreign key)的详解和实例「建议收藏」一、基本概念1、MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种。不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引。用于外键关系的字段必须在所有的参照表中进行明确地索引,InnoDB不能自动地创建索引。2、外键可以是一对一的,一个表的记录只能与另一个表的一条记录连接,或者是一对多的,一个表的记录与另一个表的多条记录连接。3、如果需要更好的…

  • ASP.NET ViewState详解[通俗易懂]

    ASP.NET ViewState详解[通俗易懂]作者:InfinitiesLoop概述ViewState是一个被误解很深的动物了。我希望通过此文章来澄清人们对ViewState的一些错误认识。为了达到这个目的,我决定从头到尾详细的描述一下整个ViewState的工作机制,其中我会同时用一些例子说明我文章中的观点,结论。比如我会用静态控件(declaredcontrols)和动态控件(dynamiccontrols)两个方面来说明同…

  • 管道socket什么意思_pipe是什么意思

    管道socket什么意思_pipe是什么意思在看Android输入系统的时候,第一次看到socketpair,发现和管道非常相似。唯他们的区别就是socketpair,默认支持全双工,而pipe是半双工的。他们一样只能用在父子进程或者线程之间通信。下面分别以socketpair和管道实现全双工通信。管道实现线程间全双工通信#include#include#include#

    2022年10月14日

发表回复

您的电子邮箱地址不会被公开。

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