ArrayList遍历或者迭代的时候能否删除元素?

关于ArrayList的面试题目

其实并没有太听明白面试官问的什么意思,大概意思就是java的ArrayList在遍历或者迭代的时候能否删除元素,当时并没有get到面试官的点,现在都不太明白他想问什么

希望大家能帮我分析一下面试官什么意思,他想考察什么问题
正确的答案是什么

阅读 5.6k
4 个回答

遍历的时候可以删除元素,但是要注意手动修改一下循环变量(减1),否则会导致中间的某些元素错误地跳过,遍历不到。

用迭代器迭代的时候可以删除元素,但是只能通过迭代器来删除,不能直接在数组上删除,否则迭代器会抛出异常。

如果有多个迭代器同时迭代的话不能删除,否则其他迭代器同样会抛出异常

    List<String> list = new ArrayList<>(
            Arrays.asList("welcome","to","码上","实战"));
        //方法1 一般型for循环遍历
        for(int i = 0;i < list.size(); i ++){
            System.out.println(list.get(i));
            // 删除 to
            if (i==1) { 
                list.remove(i);
            }
        }
        //你会发现,我删除to,结果却没有遍历到 ‘码上’
        //方法2 增强型for循环遍历
        for(String value:list){
            System.out.println(value);
            list.remove(value);
        }
        //你运行异常 java.util.ConcurrentModificationException
        //方法3 集合类的通用遍历方式
        Iterator it1 = list.iterator();
        while(it1.hasNext()){
            String next = (String) it1.next();
            System.out.println(next);
            if (next.equals("to")) {
                it1.remove();
            }
        }

方法三是最合适的删除。 关注‘码上实战’,交流。

都可以,但是循环的时候会有坑,就是删除一个元素(n)之后,后边的元素会自动前移,此时第n+1个元素会移动到第n的位置,正常循环会跳过这个元素,需要对下标做-1的操作

可以参考阿里的Java规范

【强制】不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
方式,如果并发操作,需要对 Iterator 对象加锁。
推荐问题
宣传栏