我知道了,因为,因为实际上(a,tangsc)存在的是最后一个,这样的话,那个时候已经迭代完了,就不会抛出异常了

解决方案 »

  1.   

    单线程下使用迭代器不会产生这个异常
    你可以试试直接遍历map的域 过程中对map进行增删
    或者启动多线程同时开始两个迭代器实例进行增删
    这样都会产生这个异常
      

  2.   

    这是map的特性,在key或者value被迭代的时候,不能修改map的key或者value,也不能增加或者减少.
      

  3.   

    这个是巧合而已,楼主说的对,没出错仅仅是因为放入c后,c不是位于迭代器的最后一个位置,循环结束了,把key.equals("a")改成key.equals("b")的话,那看来百分百出错。因为迭代时校验的两个值,预期数,和实际数,在这个时候不相等了,就i抛出异常了。
      

  4.   

    可以用这种方式来实现
    mport java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;public class MapIterator { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>();
    Map<String, String> tmpMap = new HashMap<String, String>();
    tmpMap.putAll(map);
    map.put("a", "tangsc");
    map.put("b", "songyuanyuan"); System.out.println("HashMap before iterator: " + map);
    Iterator<String> it1 = tmpMap.keySet().iterator();
    while (it1.hasNext()) {
    String key = it1.next();
    if (key.equals("a")) {
    map.put("c", "name");
    }
    }
    System.out.println("HashMap after iterator: " + map); }}
      

  5.   

    使用Iterator遍历集合的时候,不允许在这个过程中添加或删除数据!这是规定!
    除非你在添加或删除数据后马上使用break退出循环就没问题。
    至于为什么,这是一个叫Fast Field(快速失败)的机制。请在网上查一下就知道了!你可以这样想,使用Iterator遍历的时候,Iterator这个对象就已经知道要遍历多少次了,而每个元素的次序已经定好了。如果你在这个遍历的过程序突然添加或者删除元素,那请问你添加或删除的元素应该放在集合里的第几个位置?放在最后一个位置?放在本次循环的下一个位置?
    你最终会发现,你的Iterator对象的遍历工作已经无法继续了,因为你扰乱了他的遍历顺序和遍历的次序。
    而Iterator对象的遍历次数早已经被确定,就是这一句:Iterator it = XXX.iterator();明白没?
    不用找答案了,这是权威的回答!