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

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.dtcms.com/a/335227.html

    相关文章:

  1. colmap
  2. ABB焊接机器人弧焊省气
  3. windows扩展(外接)显示器位置调节
  4. 狗品种识别数据集:1k+图像,6个类别,yolo标注完整
  5. 利用Qwen大模型进行c++11并发库的学习,与时俱进!!!!
  6. File 类的用法和 InputStream, OutputStream 的用法
  7. C#高级用法:元组
  8. pidgen!DecodeProdKey函数分析之iDecodedBytesMax
  9. docker安装mongodb及java连接实战
  10. 视频理解综述
  11. 【异步】js中异步的实现方式 async await /Promise / Generator
  12. 码上爬第十一题【协程+wasm】
  13. 博弈论07——Lemke-Howson 算法
  14. STM32-GPIO实践部分1-跑马灯实验
  15. 【Java基础面试题】Java基础概念
  16. 按键及消抖
  17. C++ 最短路Dijkstra
  18. [Python]PTA:for 求奇数分之一序列前N项和
  19. 安卓开发选择题
  20. CUDA 编程笔记:CUDA延迟隐藏
  21. 通配符 重定向 管道符
  22. Java 中重载与重写的全面解析(更新版)
  23. 在浏览器端使用 xml2js 遇到的报错及解决方法
  24. BM25算法和传统的TF-IDF算法的区别
  25. 改进版的QGIS 的(属性查询) identify featrues 功能
  26. 算法题Day2
  27. 计组-间接寻址
  28. 抽象代数 · 代数结构 | 群、环、域、向量空间
  29. 【QT】常⽤控件详解(八) Qt窗⼝ 菜单栏 工具栏 状态栏 浮动窗口 五种内置对话框
  30. Oracle数据库文件管理与空间问题解决指南