【问题标题】:What happens to the rest of an ArrayList once an object has been deleted within it?一旦在其中删除了一个对象,ArrayList 的其余部分会发生什么?
【发布时间】:2013-07-21 19:07:58
【问题描述】:
在 Java 中,当你这样做时:
alist[0].remove();
数组列表的其余部分会发生什么。是所有对象都向上移动一个还是它们保持不变并且在 [0] 处只有一个空索引?
如果没有,是否有一种有效的方法可以将每个对象的索引向下移动一个?
澄清我所说的更有效的意思:
您可以删除第一个索引,然后遍历 ArrayList 并删除每个对象并将其重新分配给新索引,但这似乎非常低效,似乎应该有一种方法,但我已经看过了JavaDoc page for the ArrayList class 并且看不到任何可以完成我正在尝试做的事情。
【问题讨论】:
标签:
java
arraylist
indexing
【解决方案1】:
假设您实际上是想询问aList.remove(0)...
作为documented by Oracle:
public E remove(int index)
移除指定位置的元素
在这个列表中的位置。将任何后续元素向左移动
(从它们的索引中减去一个)。
所以remove 会按照您的要求进行操作。但是,您可能认为实现效率不高,因为它需要的时间与列表中剩余的元素数量成正比。例如,如果您有一个包含 100 万个项目的列表,并且您删除了索引 0 处的项目,那么剩余的 999,999 个项目将需要移动到内存中。
【解决方案2】:
忽略您发布的与ArrayList 无关的代码,如果您要查看ArrayList 的源代码,您会发现在调用ArrayList.remove(obj) 时它会找到索引(或者如果使用remove(int)它已经知道了)然后做:
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
ArrayList 由一个数组支持,它将支持数组中的所有内容向左移动。
在这种情况下,如果您使用 remove(int),则查找是 O(1),如果提供对象,则查找是 O(n),而删除操作是 O(n)。
如果您要使用LinkedList,则查找是 O(n) 或 O(n),但删除是 O(1),因为它是一个双向链表。
在选择数据结构时,重要的是要考虑您将如何使用它;总有取舍取决于您的使用模式。