A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© quq947115876 中级黑马   /  2014-9-13 20:48  /  942 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我的代码是:
  1. public static void IterMap(Map<Character,Integer> map,char[] c){
  2.                 Iterator iterator = map.keySet().iterator();
  3.                 while(iterator.hasNext()){
  4.                         Character key = (Character) iterator.next();
  5.                         //如果map集合中的key包含该字符,则为key的value值加一
  6.                         if(key.equals(Character.valueOf(c[0]))){
  7.                                 Integer count = map.get(key);
  8.                                 map.put(key, ++count);
  9.                                 return;
  10.                         }
  11.                 }
  12.                 //没有这个值得时候新加入一个key-value
  13.                 map.put(Character.valueOf(c[0]), 1);
  14.         }
复制代码
上面的代码中如果把return去掉的话会包异常java.util.ConcurrentModificationException。
这是为什么呢?
出现的原因是map在迭代的时候,不能改表map里面的内容,改变了就会出现这个异常。
map集合在迭代的时候,Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。
Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,
这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 。
Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。


评分

参与人数 1技术分 +1 收起 理由
付江涛 + 1 很给力!

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马