ArrayList底层操作机制源码解析

 更新时间:2023年09月19日 10:59:36   作者:风过无痕2018  
这篇文章主要介绍了ArrayList底层操作机制源码解析,当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍,需要的朋友可以参考下

ArrayList 的底层操作机制源码

扩容机制:

  • ArrayList中维护了一个0bject类型的数组elementData. transient Object[] elementData; //transient表示瞬间,短暂的,表示该属性不会被序列化
  • 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0,第1次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
  • 如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容, 则直接扩容elementData为1.5倍。

debug源码

  • 使用无参构造器,创建和使用ArrayList源码
    /**
     * 创建一个空的elementData数组 = {}
     */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
   /**
	* 执行list.add方法, 先确定是否要扩容,再执行添加操作
	*/
    public boolean add(E e) {
    	// 每次都要看看是否需要扩容
        ensureCapacityInternal(size + 1); //ensureCapacityInternal:确认容量
        elementData[size++] = e;
        return true;
    }
   /**
	* 该方法确定minCapacity , 第一次扩容为10
	*/
   private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { 
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        ensureExplicitCapacity(minCapacity);
    }
   /**
	* modCount:记录当前集合被修改的次数,如果elementData的容量不够,就调用grow方法扩容
	*/
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++; // modCount:记录当前集合被修改的次数,防止多线程操作出现的异常
        if (minCapacity - elementData.length > 0) 
        	// 如果elementData的容量不够,就调用grow方法扩容
            grow(minCapacity);
    }
   /**
	* 真的扩容,使用扩容机制来确定扩容到多大
	* 第一次newCapacity为10, 第二次及其以后按照1.5倍扩容
	* 扩容的是Arrays.copyOf(), 能保留以前的数据
	*/
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //(oldCapacity >> 1)的意思是oldCapacity / 2
        int newCapacity = oldCapacity + (oldCapacity >> 1); //(1.5倍扩容)
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity; //第一次就是10
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // Arrays.copyOf 将 elementData{} 扩容为newCapacity大小
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

方法一步步返回

  • 使用有参构造器,创建和使用ArrayList源码
   /**
	* 第一次就按照elementData的1.5倍扩容
	* 整个执行的流程和前面的无参构造的一样
	*/
    public ArrayList(int initialCapacity) {
        if (initialCapacity > 0) {
        	// 创建了一个指定大小的elementData数组 
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }

整个执行的流程和无参构造的一样

到此这篇关于ArrayList底层操作机制源码解析的文章就介绍到这了,更多相关ArrayList源码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot配置动态数据源的实战详解

    SpringBoot配置动态数据源的实战详解

    Spring对数据源的管理类似于策略模式,不懂策略模式也没关系,其实就是有一个全局的键值对,类型是Map<String, DataSource>,当JDBC操作数据库之时,会根据不同的key值选择不同的数据源,本文介绍了SpringBoot配置动态数据源的方法,需要的朋友可以参考下
    2024-08-08
  • 基于spring+quartz的分布式定时任务框架实现

    基于spring+quartz的分布式定时任务框架实现

    在Spring中的定时任务功能,最好的办法当然是使用Quartz来实现。这篇文章主要介绍了基于spring+quartz的分布式定时任务框架实现,有兴趣的可以了解一下。
    2017-01-01
  • java同步与异步的学习笔记整理

    java同步与异步的学习笔记整理

    在本篇文章里小编给大家整理了关于java同步与异步的学习笔记整理内容,需要的朋友们参考下。
    2020-02-02
  • Java awt-对话框简单实现方式

    Java awt-对话框简单实现方式

    这篇文章主要介绍了Java awt-对话框简单实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Mybatis 在 insert 插入操作后返回主键 id的操作方法

    Mybatis 在 insert 插入操作后返回主键 id的操作方法

    这篇文章主要介绍了Mybatis 在 insert 插入操作后返回主键 id的操作方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Java中ArrayList和LinkedList的区别

    Java中ArrayList和LinkedList的区别

    ArrayList和LinkedList在这个方法上存在一定的性能差异,本文就介绍了Java中ArrayList和LinkedList的区别,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 以实例讲解Objective-C中的KVO与KVC机制

    以实例讲解Objective-C中的KVO与KVC机制

    这篇文章主要介绍了以实例讲解Objective-C中的KVO与KVC机制,即Key-Value-Observing与Key-Value-Coding,需要的朋友可以参考下
    2015-09-09
  • java selenium处理Iframe中的元素示例

    java selenium处理Iframe中的元素示例

    本文主要介绍java selenium处理Iframe中的元素,这里整理了相关资料并附有示例代码和实现方法,有需要的小伙伴可以参考下
    2016-08-08
  • 详解Spring Boot2 Webflux的全局异常处理

    详解Spring Boot2 Webflux的全局异常处理

    这篇文章主要介绍了详解Spring Boot2 Webflux的全局异常处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • springboot集成nacos无法动态获取nacos配置的问题

    springboot集成nacos无法动态获取nacos配置的问题

    这篇文章主要介绍了springboot集成nacos无法动态获取nacos配置的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论