• 【List篇】ArrayList 详解(含图示说明)


    Java中的ArrayList是一个动态数组,可以自动扩展容量以适应数据的添加和删除。它可以用来存储各种类型的数据,例如String,Integer,Boolean等。ArrayList实现了List接口,可以进行常见的List操作,例如添加、插入、删除和访问元素等。

    在这里插入图片描述

    源码分析(JDK1.8)

    成员变量属性
    /**
      * 默认长度为10
      */
     private static final int DEFAULT_CAPACITY = 10;
    
     /**
      * 用于空实例的共享空数组实例
      * 是为了优化创建ArrayList空实例时产生不必要的空数组,使所有的ArrayList空实例底
      * 层数据结构都指向同一个空数组
      * 例如:当构造参数是指定的长度,且为0 
      *      当构造参数是一个集合,且该参数集合中的元素个数为0
      */
     private static final Object[] EMPTY_ELEMENTDATA = {
       };
    
     /**
      * 用于默认大小的空实例的共享空数组实例。
      * 将其与EMPTY_ELEMENTDATA区分开来,以了解添加第一个元素时要扩容多少
      * 用于标记当前ArrayList是使用空参构造的,在第一次使用add添加元素时,数组的最大长度直接使用默认的10
      */
     private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
       };
    
     /**
      * ★ 存储ArrayList元素的数组缓冲区,ArrayList的容量就是这个数组缓冲区的长度
      * 添加第一个元素时,任何elementData==DEFAULTCAPACITY_empty_elementData的空ArrayList
      * 都将扩展为DEFAULT_CAPACITY(默认初始容量10)
      */
     transient Object[] elementData; 
    
     /**
      * ★ 记录ArrayList 的元素个数
      */
     private int size;
    
     /**
      * ★ 数组最大的长度
      */
     private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    构造方法

    ArrayList 有三个构造函数,空参构造方法,指定初始容量值构造方法和指定集合元素列表的构造方法,如果集合中的元素不为空,新建的ArrayList集合中的元素顺序就是构造参数中的元素顺序

    • 空参构造
      之前在网上看到一个说法" 使用空参构造一个ArrayList时,默认会创建一个容量为10的数组",这个说法其实不准确。在JDK1.8以前是这样的,但是为了节省内存资源,在JDK1.8版本之后,使用空参构造方法,只会创建一个空底层数据结构长度为0的空数组结构,当第一次执行add添加元素时,才会将数组容量扩充到默认10
     public ArrayList() {
       
         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 指定初始容量值构造
      如果在构建ArrayList之前,就能明确元素的个数,那么就可以在构造ArrayList时,指定容量大小,这样就可以节省因扩容而造成的资源浪费
     public ArrayList(int initialCapacity) {
       
         if (initialCapacity > 0) {
       
             //当指定参数大于0时,真实存储数据的数据长度就是指定值
             this.elementData = new Object[initialCapacity];
         } else if (initialCapacity == 0) {
       
             //当指定参数等于0时,使用空数组
             this.elementData = EMPTY_ELEMENTDATA;
         } else {
       
              //指定的长度参数不能小于0
             throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);
         }
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 构造参数是一个集合,并按照参数集合中元素个数和顺序返回新的ArrayList
     public ArrayList(Collection<? extends E> c) {
       
         Object[] a = c.toArray();
         if ((size = a.length) 
    • 1
    • 2
    • 3
  • 相关阅读:
    寒假训练——第一周(二分)
    做自媒体怎样在一年之内赚到 13 万?
    YbtOJ「基础算法」第4章 深度搜索
    Altium Designer20 PCB规则设置
    解锁新姿势,揭秘如何通过公众号迁移方式给自己的爱号开通留言板功能
    C语言 数组
    深度解读ChatGPT基本原理
    ov多域名SSL数字证书1200元一年送一月
    MES系统在制造业中的SOP工艺标准管理
    SpringMVC总结
  • 原文地址:https://blog.csdn.net/weixin_44167408/article/details/132669656