• 21、List遍历时修改元素的问题


    List迭代时修改元素的问题

    请编写代码完成以下需求:
    判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。‘

    package com.monkey1024.list;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    /**
     * 判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。
     *
     */
    //通过注解去除黄色警告
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class ListTest02 {
    
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add("a");
            list.add("b");
            list.add("monkey");
            list.add("d");
            list.add("e");
    
            Iterator iter = list.iterator();
            while(iter.hasNext()) {
                String str = (String)iter.next();//ConcurrentModificationException并发修改异常
                if(str.equals("monkey")) {
                    list.add("1024");
                }
            }
        }
    }

    上面代码在向list中添加完元素之后再执行到String str = (String)iter.next();这行时,报出ConcurrentModificationException异常,通过ArrayList的源码可以看到,当modCount不等于expectedModCount时才会报出这个异常,上面代码在遍历集合时添加了一个元素,这样就修改了集合中的元素个数,所以会导致modCount不等于expectedModCount,这样就会报出ConcurrentModificationException异常。

    如果想要解决上面的问题,需要使用ListIterator去遍历,并且使用ListIterator向List中添加元素

    package com.monkey1024.list;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    
    /**
     * 使用ListIterator解决ConcurrentModificationException
     *
     */
    // 通过注解去除黄色警告
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class ListTest02 {
    
        public static void main(String[] args) {
            List list = new ArrayList();
            list.add("a");
            list.add("b");
            list.add("monkey");
            list.add("d");
            list.add("e");
    
            // 使用ListIterator解决上面的问题
            ListIterator listIter = list.listIterator();
            while (listIter.hasNext()) {
                String str = (String) listIter.next();
                if (str.equals("monkey")) {
                    // 使用list迭代器向集合中添加元素
                    listIter.add("1024");
                }
            }
            System.out.println(list);
        }
    }

    ListIterator中方法简介

    在ListIterator中有个previous()和hasPrevious()方法,通过这两个方法,可以将集合中的元素倒序遍历。需要注意的是在倒序遍历之前要将集合先正序遍历。

    package com.monkey1024.list;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    
    /**
     * ListIterator
     *
     */
    //通过注解去除黄色警告
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class ListIteratorTest01 {
    
        public static void main(String[] args) {
    
            List list = new ArrayList();
            list.add("a");                                    
            list.add("b");
            list.add("world");
            list.add("c");
            list.add("d");
            list.add("e");
    
            ListIterator listIter = list.listIterator();            
            while(listIter.hasNext()) {
                System.out.println(listIter.next());//获取元素并将指针向后移动
            }
    
            System.out.println("-----------------");
    
            while(listIter.hasPrevious()) {
                System.out.println(listIter.previous());         //获取元素并将指针向前移动
            }
        }
    }

     

  • 相关阅读:
    tree命令详解
    rm 命令详解
    rename命令详解
    pwd命令详解
    mv命令详解
    mkdir命令详情
    find命令详解
    dockerfile中配置时区
    docker导入导出
    docker上传私有仓库报错
  • 原文地址:https://www.cnblogs.com/zhuifeng-mayi/p/10131046.html
Copyright © 2020-2023  润新知