Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java列表中追加/删除条目是否会重新分配内存?_Java_Memory_Allocation - Fatal编程技术网

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

在Java列表中追加/删除条目是否会重新分配内存?,java,memory,allocation,Java,Memory,Allocation,这是一个关于Java如何执行的低级内存问题。在数组列表或其他类型的列表上添加和。删除。我认为Java必须重新分配内存才能在列表中添加/删除项,但它可能会做一些我没有想到的事情来避免这种情况。有人知道吗?如果“常规列表”是指java.util.list,那就是一个接口。它没有指定与添加或删除元素相关的内存是否分配或何时分配,这些是特定实现的详细信息 特别是java.util.ArrayList,它的文档说: 每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它始终至少与

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

如果“常规列表”是指
java.util.list
,那就是一个接口。它没有指定与添加或删除元素相关的内存是否分配或何时分配,这些是特定实现的详细信息

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

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

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


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

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


向列表中添加元素不会复制添加到列表中的对象。事实上,没有任何Java语句会导致对象的附加副本对程序可见(您必须显式使用复制构造函数或克隆方法才能做到这一点)。这是因为Java对象从不直接访问,而是始终通过引用访问。向集合中添加对象实际上意味着向集合中添加对该对象的新引用。

什么是常规列表?数组列表是指
ArrayList
类型吗?您看过它的实现或javadoc吗?你发现了什么?我发现的唯一一个提到重新分配的地方是“应用程序可以在使用ensureCapacity操作添加大量元素之前增加ArrayList实例的容量。这可能会减少增量重新分配的数量”,因此问题就来了。我也发现了这种模糊性,不过谢谢你的猜测。如果有人感到困惑,我会将我的问题从“…和
。删除数组列表或常规列表上的
”编辑到“…一个
数组列表或其他类型的列表。”