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

Ari*_*ule 4 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());
Run Code Online (Sandbox Code Playgroud)

如果我这样做,只有一半的元素被删除......为什么会这样?

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

        al.remove(index);

    }
    System.out.println("The Arraylist size after removal is " + al.size());
Run Code Online (Sandbox Code Playgroud)

亲切的问候阿里安

Jam*_*gne 12

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

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

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


Ósc*_*pez 8

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

for (int index = 0, n = al.size(); index < n; index++)
    al.remove(0);
Run Code Online (Sandbox Code Playgroud)

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

for (int idx = al.size() - 1; idx >= 0; idx--)
    al.remove(idx);
Run Code Online (Sandbox Code Playgroud)