首页 > 编程语言 >20220930-ArrayList扩容机制源码分析②

20220930-ArrayList扩容机制源码分析②

时间:2022-09-30 07:55:33浏览次数:64  
标签:Object int ArrayList elementData 20220930 initialCapacity 源码 null

本部分对于使用设置初始容量的方法创建ArrayList集合的方式进行源码分析。

代码

public class ArrayListSource {
    public static void main(String[] args) {
        ArrayList arrayList = new ArrayList(5);  //跳转至第一步
        for (int i = 0; i < 50; i++) {
            arrayList.add(i);
        }
    }
}

底层代码

第一步:

public ArrayList(int initialCapacity) {  //initialCapacity = 5
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];  //elementData = {null, null,null,null,null}
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
}

由上ArrayList带参构造器内容可知:

  1. 当初始容量显示的设置为0时,与默认无参构造器执行方式相同,都是将elementData设置为空数组。
  2. 当初始容量大于0时,将创建一个Object类型数组,数组大小等于初始容量。
  3. 当初始容量小于0时,将抛出异常对象IllegalArgumentException

第二步:
创建完成arrayList集合之后,进入for循环,从i=0开始,执行arrayList.add(i)方法,底层代码如下:

public boolean add(E e) {  //e = 0
        modCount++;  //modCount=0,执行之后自加1
        add(e, elementData, size);  //跳转至第三步
        return true;
}

第三步:

//e = 0
//elementData = {null, null,null,null,null}
//elementData.length = 5
//s = 0
private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)  //此时if语句不成立
            elementData = grow();
        elementData[s] = e;  //elementData = {{0, null,null,null,null}
        size = s + 1;  //size = 1
}

第四步:
程序继续执行for循环,直到size=5时,表示集合中元素已经达到容量上限,程序执行第三步中的if语句,对集合进行扩容

private Object[] grow() {
        return grow(size + 1);  //size = 6,跳转至第五步
}

第五步:

//elementData.length = 5
//minCapacity = 6
private Object[] grow(int minCapacity) {
        int oldCapacity = elementData.length;  //oldCapacity = 5
        if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {  //if语句条件成立
            int newCapacity = ArraysSupport.newLength(oldCapacity,
                    minCapacity - oldCapacity, /* minimum growth */
                    oldCapacity >> 1           /* preferred growth */);  //跳转至第六步
            return elementData = Arrays.copyOf(elementData, newCapacity);
        } else {
            return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
        }
}

第六步:

//oldLength = 5
//minGrowth = 1
//prefGrowth = 2
public static int newLength(int oldLength, int minGrowth, int prefGrowth) {
        // assert oldLength >= 0
        // assert minGrowth > 0
        int newLength = Math.max(minGrowth, prefGrowth) + oldLength;  //newLength = 7
        if (newLength - MAX_ARRAY_LENGTH <= 0) {  //if条件成立
            return newLength;  //返回第5步
        }
        return hugeLength(oldLength, minGrowth);
}

第七步:
程序执行elementData = Arrays.copyOf(elementData, newCapacity);
elementData = {0 , 1 , 2 , 3 , 4 , null , null , null}
程序继续执行for循环,当达到集合的容量上限值,继续进行扩容,扩容后的容量=原容量*1.5

标签:Object,int,ArrayList,elementData,20220930,initialCapacity,源码,null
From: https://www.cnblogs.com/zhanghuaze/p/16743668.html

相关文章

  • Apache Spark源码剖析 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1ho509WqYxsS6twPUD2tyiw点击这里获取提取码 ......
  • 秋色园QBlog V2.5 后台管理系统源码发布下载
    题外话:上周时本来是计划本周一要发布,不过计划不如变化快。 由于周六下午发布了​​​​​​ 的相关文章,瞬时有大量爱好​​.NET​​开源激情者加入,光聊天,就折腾了我不少时......
  • 20220929-ArrayList扩容机制源码分析
    示例代码publicclassArrayListSource{publicstaticvoidmain(String[]args){ArrayListarrayList=newArrayList();//跳转至第一步for......
  • Spring源码-InstantiationAwareBeanPostProcessor
    InstantiationAwareBeanPostProcessor继承了BeanPostProcessor接口,扩展了BeanPostProcessor的功能。publicinterfaceBeanPostProcessor{/**调用init方法的前置处理......
  • php源码安装
    参考:https://www.sunanzhi.com/archives/27/ 安装1、到官网获取下载地址 https://www.php.net/downloads2、下载并解压cd/home/install/php74wgethttps://www......
  • Spring源码学习:day2
    前言:我还是太懒了,连截图都懒得粘贴,故直接用书上说的话的截图吧。代码的编写过程都是应该有一个入口的,所有的代码最终都是为了那个入口更加方便更加简单而产生的。......
  • Spring 源码学习:day1
    前言:最近也不知道该忙些什么样的事情。便随便看看源码算了。正文:(1)在网上下载Spring的源码:可以采用git方式下载 https://github.com/spring-projects/s......
  • python人工智能项目实战,PDF+源码
    机器学习AI算法工程 公众号:datayx《python人工智能项目IntelligentProjectsUsingPython》实施机器学习和深度学习方法,使用Python构建智能,认知AI项目主要特点帮助您掌......
  • 互联网医院系统源码的发展趋势||数字医疗搭建
    疫情当下,为了缓解患者就医难的问题,有很多医院建立了互联网医院。不但可以利用图文,视频等方式为患者提供咨询类的医疗服务,也可以线上诊断,开处方,检查检验,结合线上线下安排进一......
  • 国庆微信换头像小程序实现原理及源码
    又准备到国庆了,很多人又要开始换头像了,每到节日微信小程序换头像小程序流量都要大涨。在网上经常看到很多国庆微信小程序换头像的,比如国庆节,圣诞节等节日头像框,一键换头像,......