当我们使用
new ArrayList()
时,内存是连续分配的吗?
如果我们调用 list.add(e)
10 次,所有元素会按添加顺序连续存储在内存中,还是随机存储在内存中?
首先你需要了解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 管理,并从底层操作系统借用,进而从硬件甚至虚拟化硬件借用......