【问题标题】:is memory contiguous allocated for arraylist?内存是连续分配给arraylist的吗?
【发布时间】:2017-01-30 05:33:32
【问题描述】:

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

谢谢。

【问题讨论】:

  • 你为什么在乎?如果您必须知道,请阅读以下内容:grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…GrepCode 是此类问题的朋友。
  • 嗯,ArrayList 是基于 Java 数组的。并且 Java 数组不能保证在内存中是连续的。但为什么这很重要。
  • 我原以为答案将是特定于操作系统的
  • @JimGarrison 当然,一个彻底的心智模型总是一件好事?或者,单纯的好奇?知道答案有助于彻底掌握,例如,简单数组和内存中的 ArrayList 之间的区别。

标签: java memory-management


【解决方案1】:

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

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

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

最后,连续内存通常是高性能本机应用程序关注的问题。在 Java 中,内存是由 JVM 管理的,是从底层 OS 借来的,然后是从硬件,甚至是虚拟化的硬件……

【讨论】:

  • 我之所以只是寻找这个的原因是因为我正在阅读各种数据结构相对于其他数据结构的优势,而数组的优势之一是连续的内存分配。我假设 ArrayLists 从你的回答中没有这个优势..
  • 就相对成本而言,数组在 Java 中几乎肯定会比链表更快。然而,Java 确实保证了结构如何以与 C++ 相同的方式映射到底层内存
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2010-10-12
  • 2013-08-23
  • 1970-01-01
相关资源
最近更新 更多