Java ArrayList存储

Java ArrayList storage

我知道 ArrayLists 引用是连续存储在堆中的。但是,如果我将一个元素添加到数组 list

的中间
ArrayList<Double> list = new ArrayList<Double>(Collections.nCopies(10, 6.5));

list.add(5, 20.0);

这如何改变它在堆中的存储方式?第一个引用的位置是否移动到新的存储单元,或者所有内容都刚刚移动过存储单元 5 在插入 20.0 后向下移动?

视情况而定。

ArrayList 视为(内部)固定大小的缓冲区,只要用完 space 就会调整大小。如果您尝试在中间插入一个元素,而缓冲区中还剩下 space,那么一切都可以简单地向下移动以为新元素腾出空间。但是,如果没有 space 剩余,则需要调整缓冲区大小,这需要重新分配它,这又 可能 需要将所有元素复制到新位置在记忆中。请注意,将缓冲区移动到新位置的决定不是由 Java 虚拟机做出的,而是由操作系统做出的。

当您创建一个 Collection 对象时,它会分配一个特定大小的内部数组。如果初始化一个空的 ArrayList,这通常大于 1。当您达到最大容量限制时,该集合将自动创建一个比当前数组更大的新内部数组,并将元素复制到新数组中。在许多实现中,每当您点击数组的 'limit' 时,它的大小就会加倍。

在这种特殊情况下,您正在创建一个大小为 10 的基础数组,然后它在调用的 add 方法的处理过程中执行扩展和复制操作。