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
相关产品推荐
相关产品推荐

