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());         //獲取元素並將指針向前移動
        }
    }
}

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM