当前位置: 首页 > ds >正文

ArrayList的扩容源码分析

各位看官,大家早安午安晚安呀~~~

如果您觉得这篇文章对您有帮助的话

欢迎您一键三连,小编尽全力做到更好
欢迎您分享给更多人哦

今天我们来学习:ArrayList的扩容源码分析

1.几个关键定义

1.表示 当前操作需要的最小容量
2.Integer.MAX_VALUE

3 .初始容量:惰性初始化:默认构造的 ArrayList 初始用空数组标记,首次添加时才真正分配空间(节省内存)

4.扩容规则:当添加元素时发现容量不足,会按照 当前容量 * 1.5 的方式进行扩容(一般是这个)  或者  扩容到minCapacity:表示 当前操作需要的最小容量 或者……………… (下面源码我会讲解)



2.源码全面解析:

首先判断当前操作需要的最小容量 是否已经超过数组容量.  如果  > =  就扩容



问题:

3.超过限制的情况

  1. 超过 MAX_ARRAY_SIZE:ArrayList 会尝试扩容到 Integer.MAX_VALUE

  2. 超过 Integer.MAX_VALUE

    • 如果所需容量计算时发生整数溢出(变成负数),会抛出 OutOfMemoryError

    • 如果正好需要 Integer.MAX_VALUE,可以成功分配(理论上的极限)

4. 实际限制

在实践中,由于数组本身有对象头开销,加上 JVM 实现限制,通常无法真正分配接近 Integer.MAX_VALUE 大小的数组。尝试分配超大数组通常会先因内存不足而失败。

5. 为啥是  Interger.MAX_VALUE - 8 ?

其实是因为对象头的存在,

对象头(对象的元信息)的内存开销

Java 中每个对象(包括数组)都有一个对象头,包含以下部分(以 64 位 JVM 为例):

  1. Mark Word(8 字节):

    • 存储对象的哈希码、锁状态、GC 分代年龄等信息

    • 在 32 位 JVM 中是 4 字节

  2. Klass Pointer(通常 8 字节,但可能压缩为 4 字节):

    • 指向对象类元数据的指针

    • 开启压缩指针(-XX:+UseCompressedOops)时为 4 字节

  3. 数组长度(仅数组有,4 字节):

    • 记录数组长度的 int 字段

总开销

  • 普通对象:8-16 字节(Mark + Klass)

  • 数组对象:12-16 字节(Mark + Klass + 数组长度)

6.总结:这样设计的原因:

  1. 预留空间给对象头

    • 确保数组本身加上对象头不会超过 Integer.MAX_VALUE

    • 8 字节是保守估计,考虑了不同 JVM 实现可能的对象头大小差异

上述就是ArrayList的扩容源码分析的全部内容啦,不知道您对文章中的问题和思想是否都学会理解了呢?

能看到这里相信您一定对小编的文章有了一定的认可。

有什么问题欢迎各位大佬指出
欢迎各位大佬评论区留言修正~~

您的支持就是我最大的动力​​​!!!

    http://www.xdnf.cn/news/18165.html

    相关文章:

  1. 1083. 数列极差问题
  2. duiLib 实现鼠标拖动标题栏时,窗口跟着拖动
  3. K8s核心组件全解析
  4. 产品设计.原型设计
  5. 嵌入式 Linux LED 驱动开发实验
  6. SpringBoot 整合 Langchain4j:系统提示词与用户提示词实战详解
  7. EP1C12F324I7N Altera Cyclone FPGA
  8. Python 读取 CSV 文件并删除前五列
  9. [安洵杯 2019]Attack
  10. Win11更新0x80073712错误解决方法
  11. Java 中重载与重写的全面解析(更新版)
  12. vscode的使用
  13. 10.从开始写LINUX内核——时钟中断
  14. 12分区南排烟机,多线模块没电
  15. nflsoi 8.16 题解
  16. day42_2025-08-16
  17. Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
  18. 第3章现象表:比较顺序表和链表
  19. 记录 GMS 认证相关条件
  20. Leetcode 14 java
  21. A*寻路算法:原理、实现与优化指南
  22. 【Java笔记】synchronized
  23. SpringBoot学习日记(九)
  24. 游戏客户端性能测试总结
  25. 【渗透实战】无下载器环境(curl/wget)下玩转 Metasploit 自动利用
  26. [创业之路-550]:公司半年度经营分析会 - 解决方案汇总
  27. “preinstall“: “npx only-allow pnpm“
  28. WrenAI部署,解决发送消息报错:failed to create asking task
  29. Day15 Docker
  30. Java设计模式详细解读