List中的三种循环遍历及删除操作

1、for循环遍历list

public static void main(String[] args) {
        List list = new ArrayList();
        list.add("asdf");
        list.add("我多想");
        list.add("我多想");
        list.add("一少年");
        list.add(1);

        System.out.println(list);
        for (int i = 0;i<list.size();i++)
        {
            System.out.println(list.get(i));

            //删除目标元素时,size-1,后续的元素位置前移,导致后续的元素位置改变。不能完整输出整个序列。
            //在测试中虽然得到正确的结果但是少扫描了元素,故新加测试例子,在list重复元素在一起遍历就会出现问题
            if(list.get(i).equals("我多想"))
            {
                list.remove(i);
            }
            System.out.println(">>>>>>>>"+list.size());
        }
        System.out.println(list);
 }

输出结果如下图:

应该将 我多想 这个元素都删除掉,没成功,list中的元素前移导致没有将所有元素都遍历

结论:这种方式的问题在于,删除某个元素后,后面的元素数组元素下标向前挪一位,所以会导致你在遍历的时候漏掉删除元素的后一个元素。

2.foreach删除

从源码中看出有个modCount计数器,在使用foreach遍历删除元素之前将当时的修改次数纪录到expectedModCount,删除元素后modCount++,导致抛出异常。

3.迭代器删除指定元素

代码如下

public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("name");
        list.add("哈哈");
        list.add("name");
        list.add("name");
        list.add("java");

        //目标删除指定元素name
        Iterator<String> it = list.iterator();
        while(it.hasNext()){
            String item = it.next();
            if (item.equals("name")){
                it.remove();
            }
        }
        System.out.println(list);
    }

迭代器可以很好的删除指定元素

总结:for循环、foreach都不能用来删除指定元素,可以通过迭代器来删除指定的元素

经验分享 程序员 微信小程序 职场和发展