是否在Java列表中附加/删除条目会重新分配内存吗?

时间:2016-01-05 17:01:52

标签: java memory allocation

这是关于Java如何在.add或其他类型的列表上执行.removeArrayList的低级内存问题。我认为Java必须重新分配内存以将项目追加/删除到列表中,但它可能正在做一些我没想到的事情来避免这种情况。有谁知道吗?

2 个答案:

答案 0 :(得分:2)

如果通过"常规列表"你的意思是java.util.List,这是一个界面。它没有指定是否或何时与添加或删除元素相关联地分配任何内存 - 这些是特定实现的细节。

特别是java.util.ArrayList,其文档说:

  

每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它始终至少与列表大小一样大。当元素添加到ArrayList时,其容量会自动增加。除了添加元素具有恒定的摊销时间成本这一事实之外,未指定增长政策的细节。

换句话说,Java没有指定问题的答案。

如果我根据可用文档推测,我猜测java.util.ArrayList.remove()从不执行任何内存分配或重新分配。从整体文档来看,似乎java.util.ArrayList.add()至少有时会分配额外的空间(以新的,更长的内部数组的形式)。然而,为了实现元素添加的不变摊销成本,我不知道如何在每个元素添加上重新分配。几乎可以肯定的是,它仅在其容量不足时重新分配,然后它将容量扩展到一个恒定因子 - 例如加倍。

答案 1 :(得分:0)

所有列表实现都需要存储有关列表中对象的一些信息以及这些对象的顺序。较大的列表需要更多此类信息,因为列表中的每个对象都有一些信息。因此,添加到列表必须平均导致为此信息分配更多存储。

向列表中添加元素不会复制添加到列表中的对象。实际上,没有Java语句会导致程序可以看到对象的附加副本(您必须明确使用复制构造函数或克隆方法来执行此操作)。这是因为Java对象永远不会直接访问,但始终通过引用进行访问。将对象添加到集合实际上意味着向对象添加新的引用。