注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

星期五

明天不上班

 
 
 

日志

 
 
关于我

一个特立独行的Java程序员,比较宅,上上网,写博客,听音乐,看电影。

网易考拉推荐

java.util.ConcurrentModificationException  

2013-01-21 20:54:15|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
for(Map<String, Object> map : resultList){
        String v_nodeName = (String)map.get("nodename");
        String v_nodeStatus = (String)map.get("nodestatus");
        if(!v_nodeName.contains(nodeName) || !v_nodeStatus.contains(nodeStatus)){
                resultList.remove(map);
        }
}

但我们在for循环中试图删除符合条件的元素时,会出现
java.util.ConcurrentModificationException

下面是网上的其他解释,更能从本质上解释原因:
Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭 代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。

正确的写法
for(Iterator it = resultList.iterator(); it.hasNext();){
        Map<String, Object> map = (Map<String, Object>)it.next();
        String v_nodeName = (String)map.get("nodename");
        String v_nodeStatus = (String)map.get("nodestatus");
        if(!v_nodeName.contains(nodeName) || !v_nodeStatus.contains(nodeStatus)){
                it.remove();
        }
  评论这张
 
阅读(244)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017