在Java中,当你这样做时:
alist[0].remove();
数组列表的其余部分会发生什么。是否所有对象都向上移动或者它们保持不变并且[0]处只有一个空索引?
如果没有,是否有一种有效的方法将每个对象的索引向下移动一个?
通过更有效的方式澄清我的意思:
你可以删除第一个索引然后遍历ArrayList并删除每个对象并将其重新分配给一个新索引,但这似乎非常低效,似乎应该有一种方法,但我已经查看了JavaDoc page for the ArrayList class,并没有看到任何可以实现我想要做的事情。
答案 0 :(得分:5)
假设您实际上想询问aList.remove(0)
...
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),因为它是双向链接列表。
在选择数据结构时,重要的是要考虑如何使用它;根据您的使用模式,总会有权衡取舍。