Map中删除数据 或是key
2013-11-28 11:08
148 查看
在Map中直接删除内容将抛出 java.util.ConcurrentModificationException 异常,如果要删除可以用Iterator的remove()方法。
以下代码报错:
Java代码
Map<String,String> map = new HashMap<String,String> (); map.put("1", "a"); map.put("2", "b"); map.put("3", "c"); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); if ("1".equals(key) || "2".equals(key)) { map.remove(key); } }
正确代码如下:
Java代码
Map<String,String> map = new HashMap<String,String> ();
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if ("1".equals(key) || "2".equals(key)) {
iterator.remove(); //添加该行代码
map.remove(key);
}
}
System.out.println(map.get("1"));
System.out.println(map.get("2"));
System.out.println(map.get("3"));
错误代码原因:Iterator 工作在一个独立的线程中,并拥有一个mutex锁。 Iterator被创建后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,Iterator会抛出java.util.ConcurrentModificationException异常。
所以Iterator在工作的时候是不允许被迭代的对象被改变的。但可使用Iterator本身的remove()来删除对象,Iterator.remove()方法会在删除当前迭代对象的同时保持索引的一致性。
以下代码报错:
Java代码
Map<String,String> map = new HashMap<String,String> (); map.put("1", "a"); map.put("2", "b"); map.put("3", "c"); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); if ("1".equals(key) || "2".equals(key)) { map.remove(key); } }
Map<String,String> map = new HashMap<String,String> (); map.put("1", "a"); map.put("2", "b"); map.put("3", "c"); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); if ("1".equals(key) || "2".equals(key)) { map.remove(key); } }
正确代码如下:
Java代码
Map<String,String> map = new HashMap<String,String> ();
map.put("1", "a");
map.put("2", "b");
map.put("3", "c");
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
if ("1".equals(key) || "2".equals(key)) {
iterator.remove(); //添加该行代码
map.remove(key);
}
}
System.out.println(map.get("1"));
System.out.println(map.get("2"));
System.out.println(map.get("3"));
Map<String,String> map = new HashMap<String,String> (); map.put("1", "a"); map.put("2", "b"); map.put("3", "c"); Iterator iterator = map.keySet().iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); if ("1".equals(key) || "2".equals(key)) { iterator.remove(); //添加该行代码 map.remove(key); } } System.out.println(map.get("1")); System.out.println(map.get("2")); System.out.println(map.get("3"));
错误代码原因:Iterator 工作在一个独立的线程中,并拥有一个mutex锁。 Iterator被创建后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,Iterator会抛出java.util.ConcurrentModificationException异常。
所以Iterator在工作的时候是不允许被迭代的对象被改变的。但可使用Iterator本身的remove()来删除对象,Iterator.remove()方法会在删除当前迭代对象的同时保持索引的一致性。
相关文章推荐
- 从标准输入中读取两个字符串 name:表示姓名,hobby:爱好;name作为key;hobby作为Value存入Map 然后根据姓名取得Value并打印,再根据name值删除map中的数据再打印ma
- 获取map中根据key进行排序的value数据
- 【方法1】删除Map中Value重复的记录,并且只保留Key最小的那条记录
- Java从文本文件中读取数据,导致Map中Key值重复
- 遍历取出Map集合key-value数据的4种方法
- 用百度map api展示时空数据(五)--老地图的添加与删除
- Cassandra key说明——Cassandra 整体数据可以理解成一个巨大的嵌套的Map Map<RowKey, SortedMap<ColumnKey, ColumnValue>>
- mysql删除有外链索引数据,Cannot delete or update a parent row: a foreign key constraint fails 问题的解决办法
- 使用Map集合开发电话簿程序,以电话号码为key,姓名为value,实现电话号码的添加,查询和删除 操作
- 【方法2】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
- 用于删除map中new出来的Key/Value 的PairDeleter
- C++:map中数据的插入和删除
- MyBatis根据Map中key作为字段名,value作为字段值修改数据
- 根据某种条件定时删除Map中的key
- 行专列,拆分json,实现数据的展示。Map<String, Object>存储多个相同的key,List<Map<String, Object>>
- 【方法1】删除Map中Value反复的记录,而且仅仅保留Key最小的那条记录
- list/map删除数据的唯一正确写法
- C++之map插入数据相同的key不能覆盖value解决办法
- Map中删除数据
- List<Map<String, String>>遍历相同数据合并(map里面某个key相同则合并数据)