List在迭代过程中如何进行增删改查 ListIterator知识点

/**
 *    案例: 有如下一个list集合,需求,遍历集合,当集合中等于"five"元素,那么就插入元素"four".
 *    
 *    解决问题的过程中发现:
 *  在迭代过程中,如果使用了集合的方法进行增删改查操作,那么迭代器会抛出 异常 ConcurrentModificationException.
    原因是,迭代器不知道集合中的变化,容易发生调用的不确定性. 
    解决办法: 在迭代时,不要使用集合的方法进行操作元素.可以使用迭代器的子接口ListIterator<E>
                    里面有很多操作元素的方法.而且可以正向迭代,反向迭代.
 *    
 *    记住****:该列表迭代器只有List接口有。
 *                而且这个迭代器可以完成在迭代过程中的增删改查动作。(原因:因为List集合有角标)
 
 *     列表迭代器列表ListIterator的概述:
 *    允许程序员按任一方向遍历List、迭代期间修改List,并获得迭代器在List中的当前位置。
 *    ListIterator没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。
 *    长度为 n 的列表的迭代器有 n+1 个可能的指针位置.
 *  
 *    具体方法用法,查看API ,Iterator 的子接口ListIterator
 
 */
public class ListIteratorDemo {

    public static void main(String[] args) {
        List list = new ArrayList();

        list.add("one");
        list.add("two");
        list.add("three");
        list.add("five");

        /*for(Iterator it = list.iterator(); it.hasNext();){
            Object obj = it.next();
            if(obj.equals("five")){

                 在迭代过程中,如果使用了集合的方法进行增删改查操作,那么迭代器会抛出异常.
                 原因是,迭代器不知道集合中的变化,容易发生调用的不确定性.
                 解决办法: 在迭代时,不要使用集合的方法进行操作元素.
                          可以使用迭代器的子接口ListIterator<E>中的方法就可以.
                          里面有很多操作元素的方法.而且可以正向迭代,反向迭代.
                 * 
                //list.add("four");    
                // 异常 ConcurrentModificationException
            }
            System.out.println(obj);
        }*/

        //用ListIterator重新解决问题
        for(ListIterator it = list.listIterator(); it.hasNext();){
            Object obj = it.next();
            if("three".equals(obj)){
                it.add("four");    //[one, two, three, four, five]
//                it.set("3");    //[one, two, 3, five]
                //对比输出结果
            }
        }
        System.out.println(list);
    }
}

 

posted @ 2016-05-02 19:44  安仔80  阅读(1464)  评论(0编辑  收藏  举报