内存是否连续分配给 ArrayLists?

is memory contiguously allocated for arraylists?

提问人:0day 提问时间:1/30/2017 最后编辑:Mehdi Charife0day 更新时间:11/13/2023 访问量:5591

问:

当我们使用内存时,内存是连续分配的吗? 如果我们调用 10 次,是所有元素都按加序连续存储在内存中,还是随机存储在内存中?new ArrayList()list.add(e)

java arraylist 内存管理 连续

评论

2赞 Jim Garrison 1/30/2017
你为什么在乎?如果你必须知道,请阅读以下内容:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/......GrepCode 是您解决此类问题的朋友。
1赞 xiaofeng.li 1/30/2017
嗯,是基于 Java 数组的。而且 Java 数组不能保证在内存中是连续的。但无论如何,这又有什么关系呢?ArrayList
1赞 Scary Wombat 1/30/2017
我本来以为答案无论如何都是特定于操作系统的
2赞 andydavies 10/5/2017
@JimGarrison 一个彻底的心智模型肯定总是一件好事吗?或者,单纯的好奇心?例如,了解答案有助于彻底掌握内存中简单数组和数组列表之间的差异。
0赞 Bohemian 11/13/2023
即使内存最初是连续分配的,JVM 也可能随时更改任何事物的实际内存地址。真正的内存地址是无关紧要的和流动的。

答:

4赞 Adam 1/30/2017 #1

首先,您需要了解 ArrayList 的工作原理。它将“引用”或“指针”存储在内部对象数组中的实际存储中。这个引用数组很可能是连续的,但特定于 JVM。要添加的实际对象存储在堆中,几乎可以肯定不会是连续的,尽管这是特定于 JVM 的。elementData

elementData[0] ===> object 1
elementData[1] ===> object 2
elementData[2] ===> object 3
...

其次,您多次提到调用 add()......当 ArrayList 内部 elementData 不再足够大时,它会将其调整为更大的大小,即 +50% IIRC,并将所有引用复制到新 elementData,实际对象不会移动。

最后,连续内存通常是高性能本机应用程序关注的问题。在 Java 中,内存由 JVM 管理,并从底层操作系统借用,进而从硬件甚至虚拟化硬件借用。

评论

0赞 adinutzyc21 1/31/2017
我之所以要寻找这个,是因为我正在阅读各种数据结构相对于其他结构的优势,而数组的优点之一是连续的内存分配。我假设 ArrayLists 没有你的答案的那个优势。
0赞 Adam 1/31/2017
就相对成本而言,是的,几乎可以肯定的是,Arrays 在 Java 中会比链表更快。然而,Java 确实保证了结构如何以与 C++ 相同的方式映射到底层内存