Exception in thread "main" java.util.ConcurrentModificationException

最近写代码竟然烦了一个很低级的错误,写出来供大家参考:
在涉及到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会自动的维护被迭代集合的索引一致性,因此能够正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值