【问题标题】: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 并且看不到任何可以完成我正在尝试做的事情。

【问题讨论】:

  • 你的意思是aList.remove(0)

标签: 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),因为它是一个双向链表。

    在选择数据结构时,重要的是要考虑您将如何使用它;总有取舍取决于您的使用模式。

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2022-12-08
      • 2015-09-06
      • 2023-03-17
      • 1970-01-01
      • 2011-08-06
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多