You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ArrayList<Integer>与int[]的性能对比:内存与效率差异咨询

核心结论

不管是存储100万还是10亿int类型数据,int[]在性能和内存占用上都显著优于ArrayList<Integer>,且数据量越大,两者的差异越不可忽略。

一、性能差异

  • 访问与读写效率:int[]是原生基本类型数组,直接在堆内存中存储原始数值,访问时无需任何额外转换;而ArrayList<Integer>存储的是Integer包装类对象的引用,读取时需要将Integer拆箱为int,写入时需要将int装箱为Integer,这两个操作会产生额外的CPU开销。在高频读写、批量遍历(如排序、统计)场景下,这种性能差距会非常明显。
  • 原生操作优化:针对int[]的原生工具类(如Arrays.sort)是直接基于基本类型实现的,比ArrayList依赖的包装类操作(如Collections.sort)少了大量对象处理逻辑,执行效率更高。

二、内存占用差异

基于64位JVM开启指针压缩的常见场景,我们可以通过具体数值对比:

  • int[]内存占用:每个int占4字节,100万数据约为4MB,10亿数据约为4GB。
  • ArrayList<Integer>内存占用:
    • 每个Integer对象本身包含12字节对象头+4字节int值,共16字节;
    • ArrayList内部的Object[]数组存储的是Integer对象的引用,每个引用占4字节;
    • 单元素总开销为16+4=20字节。
    • 100万数据约为20MB,是int[]的5倍;10亿数据约为20GB,是int[]的5倍。
      如果未开启指针压缩,每个引用占8字节,单元素总开销会达到28字节,内存差距会进一步扩大到7倍。

100万数据时,几十MB的额外内存对多数系统来说可能不会直接引发问题,但绝对不是“可忽略”的量级;到10亿数据时,几十GB的额外内存会直接占用大量堆空间,甚至触发内存溢出(OOM),完全不可忽略。

三、数据量放大后的变化

  • 性能层面:数据量越大,拆装箱、对象引用遍历的总累积开销就越高,int[]的性能优势会被持续放大,比如10亿数据的批量遍历,int[]的执行速度可能是ArrayList<Integer>的3-5倍。
  • 内存层面:内存差异的绝对值从几十MB跃升至几十GB,直接从“可接受的额外开销”变成“影响系统可用性的关键问题”,此时ArrayList<Integer>的额外内存完全无法忽略。

内容的提问来源于stack exchange,提问作者ktm5124

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 14:35:07