appending/removing 条目到 Java 列表是否重新分配内存?
Does appending/removing entries to a Java list reallocate memory?
这是关于 Java 如何在 ArrayList
或其他类型的列表上执行 .add
和 .remove
的低级记忆问题。我认为 Java 必须将内存重新分配给列表中的 append/remove 项,但它可能会做一些我没有想到的事情来避免这种情况。有人知道吗?
如果 "regular list" 是指 java.util.List
,那是一个接口。它没有具体说明是否或何时分配与添加或删除元素相关的任何内存——这些是特定实现的细节。
特别是 java.util.ArrayList
,它的文档说:
Each ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.
换句话说,Java没有指定您问题的答案。
如果我根据可用文档推测,我猜想 java.util.ArrayList.remove()
永远不会执行任何内存分配或重新分配。从总体上看,java.util.ArrayList.add()
似乎至少有时会分配额外的 space(以新的、更长的内部数组的形式)。然而,为了实现元素添加的恒定摊销成本,我看不出它如何在每个元素添加上重新分配。几乎可以肯定,它仅在其容量不足时才重新分配,然后按常数因子扩展容量——例如加倍。
所有列表实现都需要存储一些关于列表中对象的信息以及这些对象的顺序。较大的列表需要更多此类信息,因为列表中的每个对象都有一些信息。因此,平均而言,添加到列表必须导致为该信息分配更多存储空间。
向列表添加元素不会复制添加到列表的对象。实际上,没有 Java 语句会导致对象的额外副本对您的程序可见(您必须显式使用复制构造函数或克隆方法来执行此操作)。这是因为 Java 对象永远不会被直接访问,而总是通过 reference 访问。将对象添加到集合实际上意味着向集合添加一个新的对象引用。
这是关于 Java 如何在 ArrayList
或其他类型的列表上执行 .add
和 .remove
的低级记忆问题。我认为 Java 必须将内存重新分配给列表中的 append/remove 项,但它可能会做一些我没有想到的事情来避免这种情况。有人知道吗?
如果 "regular list" 是指 java.util.List
,那是一个接口。它没有具体说明是否或何时分配与添加或删除元素相关的任何内存——这些是特定实现的细节。
特别是 java.util.ArrayList
,它的文档说:
Each ArrayList instance has a capacity. The capacity is the size of the array used to store the elements in the list. It is always at least as large as the list size. As elements are added to an ArrayList, its capacity grows automatically. The details of the growth policy are not specified beyond the fact that adding an element has constant amortized time cost.
换句话说,Java没有指定您问题的答案。
如果我根据可用文档推测,我猜想 java.util.ArrayList.remove()
永远不会执行任何内存分配或重新分配。从总体上看,java.util.ArrayList.add()
似乎至少有时会分配额外的 space(以新的、更长的内部数组的形式)。然而,为了实现元素添加的恒定摊销成本,我看不出它如何在每个元素添加上重新分配。几乎可以肯定,它仅在其容量不足时才重新分配,然后按常数因子扩展容量——例如加倍。
所有列表实现都需要存储一些关于列表中对象的信息以及这些对象的顺序。较大的列表需要更多此类信息,因为列表中的每个对象都有一些信息。因此,平均而言,添加到列表必须导致为该信息分配更多存储空间。
向列表添加元素不会复制添加到列表的对象。实际上,没有 Java 语句会导致对象的额外副本对您的程序可见(您必须显式使用复制构造函数或克隆方法来执行此操作)。这是因为 Java 对象永远不会被直接访问,而总是通过 reference 访问。将对象添加到集合实际上意味着向集合添加一个新的对象引用。