一旦在其中删除了一个对象,ArrayList的其余部分会发生什么?

时间:2013-07-21 19:07:58

标签: java arraylist indexing

在Java中,当你这样做时:

alist[0].remove();

数组列表的其余部分会发生什么。是否所有对象都向上移动或者它们保持不变并且[0]处只有一个空索引?

如果没有,是否有一种有效的方法将每个对象的索引向下移动一个?

通过更有效的方式澄清我的意思:

你可以删除第一个索引然后遍历ArrayList并删除每个对象并将其重新分配给一个新索引,但这似乎非常低效,似乎应该有一种方法,但我已经查看了JavaDoc page for the ArrayList class,并没有看到任何可以实现我想要做的事情。

2 个答案:

答案 0 :(得分:5)

假设您实际上想询问aList.remove(0) ...

作为documented by Oracle

  

public E remove(int index)

     

删除指定的元素   在此列表中的位置。将任何后续元素向左移动   (从他们的指数中减去一个)。

所以remove可以根据您的需要进行操作。但是,您可能不会认为实现有效,因为它需要的时间与列表中剩余的元素数量成比例。例如,如果您有一个包含100万个项目的列表,并且您在索引0处删除了该项目,那么剩余的999,999个项目将需要在内存中移动。

答案 1 :(得分:1)

忽略您发布的与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),因为它是双向链接列表。

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