ConcurrentModificationException的例子 我知道了,因为,因为实际上(a,tangsc)存在的是最后一个,这样的话,那个时候已经迭代完了,就不会抛出异常了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 单线程下使用迭代器不会产生这个异常你可以试试直接遍历map的域 过程中对map进行增删或者启动多线程同时开始两个迭代器实例进行增删这样都会产生这个异常 这是map的特性,在key或者value被迭代的时候,不能修改map的key或者value,也不能增加或者减少. 这个是巧合而已,楼主说的对,没出错仅仅是因为放入c后,c不是位于迭代器的最后一个位置,循环结束了,把key.equals("a")改成key.equals("b")的话,那看来百分百出错。因为迭代时校验的两个值,预期数,和实际数,在这个时候不相等了,就i抛出异常了。 可以用这种方式来实现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); }} 使用Iterator遍历集合的时候,不允许在这个过程中添加或删除数据!这是规定!除非你在添加或删除数据后马上使用break退出循环就没问题。至于为什么,这是一个叫Fast Field(快速失败)的机制。请在网上查一下就知道了!你可以这样想,使用Iterator遍历的时候,Iterator这个对象就已经知道要遍历多少次了,而每个元素的次序已经定好了。如果你在这个遍历的过程序突然添加或者删除元素,那请问你添加或删除的元素应该放在集合里的第几个位置?放在最后一个位置?放在本次循环的下一个位置?你最终会发现,你的Iterator对象的遍历工作已经无法继续了,因为你扰乱了他的遍历顺序和遍历的次序。而Iterator对象的遍历次数早已经被确定,就是这一句:Iterator it = XXX.iterator();明白没?不用找答案了,这是权威的回答! 循环双链表类的深拷贝问题 在vm将要结束的时候执行某段程序。 java中关于finalize()方法 jComboBox 允许编辑后,编辑的值变了触发什么事件?谢xie InputStream为何是空指针? 如何调用一个方法中的参数? 老师布置的一道题目,把文本里面字母大小写改正确?求解 这个错误怎么解决:java.lang.UnsatisfiedLinkError: no db2jdbc (libdb2jdbc.so or .so) in java.library.path 菜鸟问题之————我不能导入类!why? 类的测试问题 怎么销毁java中的线程呢? java 锁的问题
你可以试试直接遍历map的域 过程中对map进行增删
或者启动多线程同时开始两个迭代器实例进行增删
这样都会产生这个异常
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); }}
除非你在添加或删除数据后马上使用break退出循环就没问题。
至于为什么,这是一个叫Fast Field(快速失败)的机制。请在网上查一下就知道了!你可以这样想,使用Iterator遍历的时候,Iterator这个对象就已经知道要遍历多少次了,而每个元素的次序已经定好了。如果你在这个遍历的过程序突然添加或者删除元素,那请问你添加或删除的元素应该放在集合里的第几个位置?放在最后一个位置?放在本次循环的下一个位置?
你最终会发现,你的Iterator对象的遍历工作已经无法继续了,因为你扰乱了他的遍历顺序和遍历的次序。
而Iterator对象的遍历次数早已经被确定,就是这一句:Iterator it = XXX.iterator();明白没?
不用找答案了,这是权威的回答!