提问人:0day 提问时间:1/30/2017 最后编辑:Mehdi Charife0day 更新时间:11/13/2023 访问量:5591
内存是否连续分配给 ArrayLists?
is memory contiguously allocated for arraylists?
问:
当我们使用内存时,内存是连续分配的吗?
如果我们调用 10 次,是所有元素都按加序连续存储在内存中,还是随机存储在内存中?new ArrayList()
list.add(e)
答:
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++ 相同的方式映射到底层内存
评论
ArrayList