`
臻是二哥
  • 浏览: 183524 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Java技术分享
浏览量:0
社区版块
存档分类
最新评论

Exception in thread "main" java.util.ConcurrentModificationException

    博客分类:
  • JAVA
阅读更多
最近写代码竟然烦了一个很低级的错误,写出来供大家参考:
在涉及到map或者list删除的时候,我们经常写出如下错误代码:

LinkedHashMap<String,String> lhm=new LinkedHashMap<String,String>();
		lhm.put("a","a");
		lhm.put("b","b");
		lhm.put("c","c");
		lhm.put("d","d");
		Iterator<String> it=lhm.keySet().iterator();
while(it.hasNext())
{
   String str=it.next();
   if("a".equals(str))
       lhm.remove(str);
}

结果编译器报错Exception in thread "main" java.util.ConcurrentModificationException

正确代码如下:
LinkedHashMap<String,String> lhm=new LinkedHashMap<String,String>();
		lhm.put("a","a");
		lhm.put("b","b");
		lhm.put("c","c");
		lhm.put("d","d");
		Iterator<String> it=lhm.keySet().iterator();
while(it.hasNext())
{
   String str=it.next();
   if("a".equals(str))
       it.remove(str);
}



仅仅相差一个it.remove(str),你是不是也经常马虎呢?
其实,Iterator可以理解为一个索引,他依靠在其所要迭代的集合上,一旦使用lhm.remove,就会使原来的集合结构遭到破坏,此时原来的集合与iterator的索引结构不一致,自然iterator就会报错。而用iteraotr.remove(),iterator会自动的维护被迭代集合的索引一致性,因此能够正常运行。
0
3
分享到:
评论
2 楼 臻是二哥 2014-09-22  
可能我说道而不太准确,应该是那些能使用iterator迭代访问的数据结构,在迭代过程中要删除数据时,应该这么做,不知道这下我说明白了没有?
1 楼 bitray 2014-09-22  
list类的都得这么操作啊

相关推荐

Global site tag (gtag.js) - Google Analytics