Java中Array与ArrayList内存分配辨析:哪种表述正确?
核心结论:你的理解完全正确,文章表述存在错误
1. 基本类型数组的内存逻辑
- 基本类型数组(如示例中的
int[] primitiveArray)的实际数值直接存储在连续的内存区域中,每个元素占用固定字节数(比如int占4字节)。通过索引可以直接计算出目标元素的内存地址,这也是数组随机访问速度快的核心原因。
2. 对象类型数组的内存逻辑
- 对象类型数组(如示例中的
Integer[] objectArray)本身是一块连续的内存,但其中存储的不是Integer对象的实际值,而是指向堆中Integer对象的引用地址(64位JVM下每个引用占8字节)。这些引用在数组内存中是连续排列的,但对应的Integer对象本身可能分散在堆的不同位置。
3. ArrayList的内存本质
- Java的
ArrayList内部完全依赖一个可动态扩容的Object[]数组实现存储(你指定初始容量5时,内部就会先创建一个容量为5的Object[])。 - 和对象类型数组一样,这个内部
Object[]存储的是指向堆中对象的连续引用,引用的内存位置是连续的。所谓的“动态特性”,只是当内部数组容量不足时,JVM会重新分配一块更大的连续内存块,把原数组的引用复制到新数组中——无论扩容前后,当前使用的内部数组的引用始终是连续存储的。
文章表述错误的根源
文章混淆了两个关键概念:
- 把“ArrayList内部存储的引用是否连续”和“堆中对象本身的存储位置”混为一谈;
- 误以为动态扩容意味着存储的引用不连续,但实际上扩容只是更换了内部数组的内存块,每个数组实例的引用始终保持连续。
内容的提问来源于stack exchange,提问作者ayush
相关产品推荐
相关产品推荐

