背景:在写业务代码的时候,需要筛选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}]
在实际业务代码中,用迭代器循环删除的方法得到了理想的方法。