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

时间:2012-02-16 15:02:36

标签: java collections

我正在尝试练习,我会向一个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());
亲切的问候 阿里安

6 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:8)

请注意,您只需使用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);

答案 2 :(得分:2)

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

答案 3 :(得分: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--

答案 4 :(得分:1)

删除项目时,它会收缩合同。

假设您有项目0 1和2

您的索引是0

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

有道理吗?

答案 5 :(得分:1)

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

while (!al.isEmpty())
{

    al.remove(al.indexOf(al.size()-1));

}