小工具知识网

当前位置: 首页 > 行业知识 > 探秘ArrayList源码:Java动态数组的背后实现

行业知识

探秘ArrayList源码:Java动态数组的背后实现

2026-10-29 03:18:34 来源:互联网转载

探秘ArrayList源码:Java动态数组的背后实现

  • 一、成员变量
  • 二、构造器
    • 1、默认构造器
    • 2、带初始容量参数构造器
    • 3、指定collection元素参数构造器
    • 三、add()方法扩容机制
    • 四、场景分析
      • 1、对于ensureExplicitCapacity()方法
        • 1.1 add 进第 1 个元素到 ArrayList 时
        • 1.2 当 add 第 2 个元素时
        • 1.3 直到添加第 11 个元素
        • 2、对于grow() 方法:
          • 2.1 当 add 第 1 个元素时
          • 2.2 当 add 第 11 个元素进入 grow 方法时
          • 五、心得体会
          • ��、源码简易流程图

            一、成员变量

            读者需先对源码的成员变量阅览一遍,看个眼熟,有助于后面源码的理解

            private static final long serialVersionUID = 8683452581122892189L;    /**     * 默认初始容量大小     */    private static final int DEFAULT_CAPACITY = 10;    /**     * 空数组(用于空实例)。     */    private static final Object[] EMPTY_ELEMENTDATA = {};     //用于默认大小空实例的共享空数组实例。      //我们把它从EMPTY_ELEMENTDATA数组中区分出来,以知道在添加第一个元素时容量需要增加多少。    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};    /**     * 存储ArrayList元素的数组缓冲区     */    transient Object[] elementData;     /**     * ArrayList 所包含的元素个数     */    private int size;

            二、构造器

            1、默认构造器

            /** *默认构造函数,使用初始容量10构造一个空列表(无参数构造) */public ArrayList() {    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}

            以无参数构造方法创建 ArrayList时,实际上初始化赋值的是一个空数组。此时并没有为它创建对象,当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为 10。

            2、带初始容量参数构造器

            /** * 带初始容量参数的构造函数。(用户自己指定容量) */public ArrayList(int initialCapacity) {    if (initialCapacity > 0) {//初始容量大于0        //创建initialCapacity大小的数组        this.elementData = new Object[initialCapacity];    } else if (initialCapacity == 0) {//初始容量等于0        //创建空数组        this.elementData = EMPTY_ELEMENTDATA;    } else {//初始容量小于0,抛出异常        throw new IllegalArgumentException("Illegal Capacity: "+                                           initialCapacity);    }}

            3、指定collection元素参数构造器

            /***构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回*如果指定的集合为null,throws NullPointerException。*/ public ArrayList(Collection

上一篇:泥圈视频下载秘籍,轻松掌握下载技巧,快速畅享视频娱乐!

下一篇:浪潮服务器滑道怎么安装?