for循环中删除,数据不正确

背景:在写业务代码的时候,需要筛选list中符合条件的对象 ,for循环不能奏效,当时的处理方法是,将删除的index存放在数组中,然后再倒序删除原list中的数据。现在来试一下各种方法循环删除的功能。

        List<Map<String,Object>> tempList = new ArrayList<Map<String,Object>>();
		
		for(int i=0;i<=6;i++){
			Map<String,Object> tempMap = new HashMap<String,Object>();
			tempMap.put("key", i);
			tempMap.put("value", i+"i");
			tempList.add(tempMap);
		}
		
		for(int i=0;i<tempList.size();i++){
			Map<String,Object> tempMap = tempList.get(i);
			System.out.println("当前list大小:"+tempList.size());
			System.out.println("modiedMap"+tempList);
			System.out.println("当前的key===="+tempMap.get("key"));
			if((Integer)tempMap.get("key")==2){
				tempList.remove(i);
			}
		}

运行结果发现:删掉了key=2的map,但是同时也略过了key=3的map。

        //换成foreach循环
        for(Map<String,Object> temMap : tempList){
			System.out.println("当前list大小:"+tempList.size());
			System.out.println("modiedMap"+tempList);
			System.out.println("当前的key===="+temMap.get("key"));
			if((Integer)temMap.get("key")==2){
				tempList.remove(temMap);
			}
		}

报错:Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at com.csii.bmp.baseinfo.action.Test.main(Test.java:35)

原因:代码中修改了list,导致list的size前后不一致,arraylist判断报错。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		System.out.println("a");
		List<Map<String,Object>> tempList = new ArrayList<Map<String,Object>>();
		
		for(int i=0;i<=6;i++){
			Map<String,Object> tempMap = new HashMap<String,Object>();
			tempMap.put("key", i);
			tempMap.put("value", i+"i");
			tempList.add(tempMap);
		}
		System.out.println("原始的tempList==="+tempList);

		Iterator<Map<String,Object>> it = tempList.iterator();
		while(it.hasNext()){
			Map<String,Object> tempMap = it.next();
			System.out.println("当前处理的tempMap:==="+tempMap);
			if((Integer)tempMap.get("key")==2){
				it.remove();
			}
			System.out.println("处理后的tempList==="+tempList);
			//验证是否会跳过下一个,结果发现不会
			if((Integer)tempMap.get("key")==3){
				System.out.println("验证3啦!!");
			}
		}
		
	}

}

运行结果:删掉了想要删掉的数据,并且没有跳到下一个

原始的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=2i, key=2}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
当前处理的tempMap:==={value=0i, key=0}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=2i, key=2}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
当前处理的tempMap:==={value=1i, key=1}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=2i, key=2}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
当前处理的tempMap:==={value=2i, key=2}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
当前处理的tempMap:==={value=3i, key=3}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
验证3啦!!
当前处理的tempMap:==={value=4i, key=4}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
当前处理的tempMap:==={value=5i, key=5}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]
当前处理的tempMap:==={value=6i, key=6}
处理后的tempList===[{value=0i, key=0}, {value=1i, key=1}, {value=3i, key=3}, {value=4i, key=4}, {value=5i, key=5}, {value=6i, key=6}]

在实际业务代码中,用迭代器循环删除的方法得到了理想的方法。

猜你喜欢

转载自blog.csdn.net/singleton_/article/details/84785400