博客
关于我
ArrayList扩容源码剖析
阅读量:799 次
发布时间:2023-04-02

本文共 1432 字,大约阅读时间需要 4 分钟。

ArrayList的内部机制解析

1. ArrayList的基本结构

ArrayList在Java中属于动态数组结构,采用数组来存储元素。其内部维护了一个Object类型的数组elementData,用于存储各种类型的对象。数组的具体实现通过transient修饰符标记,表示在序列化过程中不会被写入二进制流。

在创建ArrayList对象时,如果使用无参数构造器,elementData的初始容量为0,即一个空数组。这种方式在第一次添加元素时会触发扩容逻辑。具体来说,第一次添加元素时,elementData的大小会增加到10。如果需要再次扩容,容量会以1.5倍的比例增长。

如果使用带有指定容量的构造器,elementData的初始容量会直接设置为指定的值。需要注意的是,无论是哪种构造方式,ArrayList都会在元素添加时动态调整数组大小,确保有足够的空间存放元素。

2. 添加元素的扩容机制

当尝试向ArrayList中添加元素时,首先会检查当前数组的长度是否已经满足需求。如果满足,则直接将元素添加到适当的位置;如果不满足,则需要扩容。

扩容的逻辑主要包含以下几个步骤:

  • 调用ensureCapacityInternal方法,确认当前数组是否需要扩容。
  • 如果需要扩容,调用ensureExplicitCapacity方法,确定是否需要显式扩容。
  • 如果确实需要扩容,调用grow方法来增加数组的容量。
  • 在扩容时,grow方法会根据当前数组长度计算出新的容量,通常以1.5倍的比例增长。为了避免超出整数范围,新容量不会超过Integer.MAX_VALUE
  • 使用Arrays.copyOf方法将旧数组扩容为新容量,并将新数组赋值给elementData
  • 需要注意的是,在扩容过程中,旧数组的内容会被保留,并通过Arrays.copyOf方法复制到新数组中。

    3. 初始化容量与实际使用

    在实际应用中,ArrayList的初始化容量与实际使用需求之间存在一定的差距。为了优化性能,ArrayList采用了一种预分配机制,避免频繁的数组扩容操作。

    具体来说:

    • 当使用无参数构造器创建ArrayList时,初始容量为0。第一次添加元素时,容量会预先扩容到10个单位。
    • 如果后续需要再次扩容,容量会以1.5倍的比例增加(例如,从10扩容到15,再从15扩容到22.5,取整后变为23)。
    • 使用带有指定容量的构造器时,初始容量会直接设置为指定值,不会像无参数构造器那样从0开始。

    这种预分配机制能够显著提升ArrayList的性能表现,减少不必要的内存分配和数组操作。

    4. 底层实现细节

    从底层源码来看,ArrayList的核心逻辑集中在以下几个方面:

    • 数组管理:通过elementData数组来存储和管理元素。
    • 扩容逻辑:采用动态扩容策略,确保数组始终有足够的空间存放元素。
    • 元素添加:通过add方法实现元素的添加,内部逻辑包括判断当前数组是否有足够的空间,并进行必要的扩容操作。
    • 数组复制:在扩容时,使用Arrays.copyOf方法将旧数组扩容为新容量,并将新数组赋值给elementData

    这种设计使得ArrayList在实际应用中表现出色,能够高效地管理动态大小的集合数据。

    5. 总结

    通过上述分析可以看出,ArrayList的内部实现机制非常高效,能够在动态扩容和数组操作方面提供良好的性能支持。理解其内部逻辑对于优化应用程序的性能非常重要。

    转载地址:http://aqefk.baihongyu.com/

    你可能感兴趣的文章
    OSG学习:纹理映射(六)——灯光
    查看>>
    OSG学习:纹理映射(四)——三维纹理映射
    查看>>
    OSG:从源码看Viewer::run() 一
    查看>>
    osi 负载均衡
    查看>>
    OSI七层模型与TCP/IP五层模型(转)
    查看>>
    OSI七层模型与TCP/IP四层与五层模型详解
    查看>>
    OSI七层模型的TCP/IP模型都有哪几层和他们的对应关系?
    查看>>
    OSI操作系统(NETBASE第八课)
    查看>>
    OSM数据如何下载使用(地图数据篇.11)
    查看>>
    OSPF 四种设备角色:IR、ABR、BR、ASBR
    查看>>
    OSPF 四种路由类型:Intra Area、Inter Area、第一、二类外部路由
    查看>>
    OSPF 学习
    查看>>
    OSPF 支持的网络类型:广播、NBMA、P2MP和P2P类型
    查看>>
    OSPF 概念型问题
    查看>>
    OSPF 的主要目的是什么?
    查看>>
    OSPF5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
    查看>>
    SQL Server 存储过程分页。
    查看>>
    OSPFv3:第三版OSPF除了支持IPv6,还有这些强大的特性!
    查看>>
    OSPF不能发现其他区域路由时,该怎么办?
    查看>>
    OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
    查看>>