从ArrayList中删除多个项目时,为什么最好使用while循环而不是递减循环?

时间:2016-05-30 06:04:21

标签: java for-loop arraylist

我现在正在阅读一些编程书籍和在线课程(所以没有老师可以问),而且我在每个人看到过同样的事情。在每一个中,它表示当你从Java中的ArrayList中删除多个项目时,你不应该使用for循环而是使用while循环。我理解你为什么不使用

for (int i = 0; i < arylst.size(); i++) {...}

但是当我尝试这样做时

for (int i = arylst.size() - 1; i >= 0; i--) {...}

它似乎工作正常。在某些情况下,这会导致问题吗?为什么这不是正确的方法呢?

2 个答案:

答案 0 :(得分:3)

如果您使用for-each循环删除ListArrayList中的元素,则会面临java.util.ConcurrentModificationException。您需要使用java.util.Iterator

以下是一个例子: -

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list= new ArrayList<Integer>();
        for(int i=1; i<=10; i++){
            list.add(i);
        }
        System.out.println("list (before) = "+list);

        // removing the even elements
        System.out.println("even numbers have been removed");
        Iterator<Integer> iterator =list.iterator();
        while(iterator.hasNext()){
            Integer num= iterator.next();
            if(num%2==0){
                iterator.remove();
            }
        }       
        System.out.println("list (after) = "+list);     
    }

}

请查看此链接:http://docs.oracle.com/javase/tutorial/collections/interfaces/collection.html

据说:

  

请注意,Iterator.remove是修改集合的唯一安全方法   在迭代期间;如果底层的行为是未指定的   在迭代进入时,以任何其他方式修改集合   进展。

使用for each循环

的示例
public static void main(String[] args) {
    List<Integer> list= new ArrayList<>();
    for(int i=1; i<=10; i++){
        list.add(i);
    }
    System.out.println("list (before) = "+list);

    // removing the even elements
    System.out.println("even numbers have been removed");

    for(Iterator<Integer> iterator = list.iterator(); iterator.hasNext(); ){
        Integer num = iterator.next();
        if(num%2==0){
            iterator.remove();
        }
    }       
    System.out.println("list (after) = "+list);     
}

答案 1 :(得分:2)

关于递减循环没有任何不正确之处。

它可以并且通常导致的唯一问题是错误,因为写入时缺少符号。它不是for循环的90%用例,因此它可能不是每个人都能直观地编写,因此更容易导致错误。 这就是为什么在教学书籍中首选while循环。