【Java面试题】List如何一边遍历,一边删除?

java开发手册:不要在foreach循环里进行元素的remove/add操作。remove元素请使用terator方法,如果并发操作,需要对iterator对象加锁。

 可能很多新手(包括当年的我,哈哈)第一时间想到的写法是下面这样的:

List<String> list=new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        
        for(String i:list) {
            if(i.equals("1")) {
                list.remove(i);
            }
        }
        System.out.println(list);

异常

 

 让我们看一下下面的字节码

由此可以看出,foreach循环在实际执行时,其实使用的是Iterator,使用的核心方法是hasnext()next()

 

下面写出3种正确写法

使用iterator的remove

List<String> list =new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        Iterator iter=list.iterator();
        while(iter.hasNext()) {
            String all=(String) iter.next();
            if(all.equals("1")) {
                iter.remove();
            }
        }
        System.out.println(list);

for正循环遍历

这种实现方式比较好理解,就是通过数组的下标来删除,不过有个注意事项就是删除元素后,要修正下下标的值

List<String> list =new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        for(int i=0;i<list.size();i++) {
            String iter=list.get(i);
            if(iter.equals("1")) {
                list.remove(i);
                i=i-1;
            }
        }
        System.out.println(list);

for倒序遍历

List<String> list =new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        for(int i=list.size()-1;i>=0;i--) {
            String iter=list.get(i);
            if(iter.equals("1")) {
                list.remove(i);
            }
        }
        System.out.println(list);

 

 

花名龙欺,支持一波

posted @ 2020-05-13 13:13  龙欺  阅读(455)  评论(0)    收藏  举报