循环遍历和arraylist并删除指定索引处的元素

我正在尝试练习,我会向一个arraylist添加1000个元素,然后再次从列表中系统地删除它们(通过指定索引)。 这背后的想法是比较LinkedList和ArrayList的性能。

int totalObjects = 0; for(int i = 0; i < 1000; i++) { totalObjects += 1; al.add("Object " + totalObjects); } System.out.println("The Arraylist size is " + al.size()); 

如果我执行以下操作,只有一半的元素被删除……为什么会这样?

 for(int index = 0; index < al.size(); index++) { al.remove(index); } System.out.println("The Arraylist size after removal is " + al.size()); 

亲切的问候阿里安

发生这种情况是因为您通过删除来更改索引。 如果删除元素0,则元素1现在变为元素0.现在,当您下一次删除1时,这就是过去的元素2,而元素1仍然存在于索引0处。

避免这种情况的最简单方法是从头到尾循环。

或者,您可以继续删除索引0,直到ArrayList为空。

请注意,只需使用clear()方法即可立即删除所有元素。 在您的代码中,问题是列表在您迭代它的同时被修改,从而有效地减小了它的大小,因此index < al.size()条件失败。 试试这个:

 for (int index = 0, n = al.size(); index < n; index++) al.remove(0); 

或者,此解决方案最后删除元素,使其更有效(不再需要复制元素):

 for (int idx = al.size() - 1; idx >= 0; idx--) al.remove(idx); 

因为在从ArrayList中删除元素时,其索引正在更新。 因此,您删除位置0处的元素,位置1中的元素现在位于索引0位置。 因此,当您删除索引1处的元素时,您将在原始ArrayList索引2处移除元素,依此类推。

通过循环查看再次删除元素的位置。 每当你删除元素时,al.size()返回的值减少,而你的索引增加。 这意味着你只会迭代一半你想要的时间。

解决方法是这样做。

 int size = al.size(); for(int index = 0; index < size; index++ ) { 

然后做工作。 这样大小不会改变。

另一件需要记住的事情是,当您从索引0处的arraylist中删除某些内容时,索引1将成为索引0.因此,从迭代中进行迭代可能更好

 int index = al.size(); index >=0 ; index-- 

删除项目时,它会收缩的列表。

假设您有项目0 1和2

你的指数是0

你删除0,你的索引现在是1,你删除2,因为它现在在索引1。

说得通 ?

通常只有一半的列表为空,因为当您从列表中删除元素时,列表的大小会减小,但索引会增加。 他们在中间见面。 如果你真的想逐个删除元素,并从最后一个元素删除到第一个元素。 我建议你使用:

 while (!al.isEmpty()) { al.remove(al.indexOf(al.size()-1)); }