正确处理移除list中数据

原创
2015/10/12 17:28
阅读数 203

首先大家先看一段代码:

for (Map<String, Object> map : dataMap) {
	String roomStateStr = (String) map.get("RoomState");
	int mapRoomState = Integer.parseInt(roomStateStr);
	if(mapRoomState != roomStateID){
		dataMap.remove(map);
	}
}

 

现象:

      该程序会抛出一个  java.util.ConcurrentModificationException异常。

分析:

      对 Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map 的内容时,会抛出java.util.ConcurrentModificationException 异常。 因为在修改数据时不能同步原有list中数据,当下一次循环时找不到数据。

 

解决办法:

       Iterator 在工作的时候是不允许被迭代的对象被改变的,使用 Iterator 本身的方法 remove() 来删除对 
象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

 

改后代码:

      

Iterator<Map<String, Object>> ite = dataMap.iterator();
while (ite.hasNext()) {
    Map<String, Object> map = ite.next();
	String roomStateStr = (String) map.get("RoomState");
	int mapRoomState = Integer.parseInt(roomStateStr);
	if (mapRoomState != roomStateID) {
		ite.remove();
	}
}

 

补充:

      或许有人可能会问如果我不用增强for循环,直接用.get(index)方法会不会报错?

   代码如下:

      

for (int i = 0; i < dataMap.size(); i++) {
	String roomStateStr = (String) dataMap.get(i).get("RoomState");
	int mapRoomState = Integer.parseInt(roomStateStr);
	if (mapRoomState != roomStateID) {
		dataMap.remove(dataMap.get(i));
	}
}

  大家可以看到通过list的下表索引来修改list数据是不会出错,但是不能完全遍历,会漏掉遍历几个数据,得到的结果会比正确的结果多

  分析:

       大家可以这样认为:通过所引来循环时,jvm记录的是所引值,当移除当前对象后,其他元素的索引号不会同步改变。下次循环仍可以找到对应数据。而增强for循环,记录的是当前对象,当下次循环时,会先找到该对象,然后游标向下移,这时候找不到对象所以结果会混乱。


展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部