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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yumin 中级黑马   /  2015-1-20 02:00  /  2590 人查看  /  14 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天在做练习的时候,发现一个问题就是在迭代器里面删除集合元素时map2.remove(key1);报错,而it.remove();//根据键删除        就可以正常工作,remove(key);是集合的方法为什么在程序中会出现报错的问题呢?
  1. public static void getMap2(Map<Integer, String> map1)//获取比较后的集合
  2. {
  3.         Map<Integer, String> map2 =map1;
  4.         Set<Integer> key =map2.keySet();//获取键序列
  5.         Iterator<Integer> it =key.iterator();//迭代器
  6.         while(it.hasNext())//判断
  7.         {
  8.                 Integer key1 =it.next();//获取键
  9.                 if ((key1>50)&&(key1<150))                //比较键在50<key<150时删除元素
  10.                         //map2.remove(key1);//为什么不能使用?这一句报错,没有结果
  11.                         it.remove();//根据键删除                               
  12.         }
  13.         System.out.println("判断后的结果");
  14.         show(map2);//打印结果
  15. }
复制代码





评分

参与人数 1黑马币 +6 收起 理由
jojo + 6 不错,让我拾起了一个忽视的知识点。.

查看全部评分

14 个回复

倒序浏览
你可以查看API中关于keySet的说明:“返回此映射中包含的键的 Set 视图。该 set 受映射支持,所以对映射的更改可在此 set 中反映出来,反之亦然。如果对该 set 进行迭代的同时修改了映射(通过迭代器自己的 remove 操作除外),则迭代结果是不确定的。set 支持元素移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作可从映射中移除相应的映射关系。”
就是说在迭代器中你可以使用set集合中的的remove方法和iterator中的remove方法对映射(map集合)进行修改,但是不能在迭代器中用map集合的remove方法修改映射(map集合)。
不知道这么说是否表达清楚了~~~

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报 0 1
迭代器只是查询集合中的元素而已
回复 使用道具 举报
迭代器遍历的时候不能操作集合的增删,不然就会报并发修改异常,你用迭代器操作就没事。用集合操作就会出问题。在遍历的时候修改集合要么都用集合操作,要么都用迭代器操作。
回复 使用道具 举报
天堂雨 发表于 2015-1-20 09:32
你可以查看API中关于keySet的说明:“返回此映射中包含的键的 Set 视图。该 set 受映射支持,所以对映射的 ...

O(∩_∩)O谢谢~
回复 使用道具 举报
Lscreat 发表于 2015-1-20 10:05
迭代器遍历的时候不能操作集合的增删,不然就会报并发修改异常,你用迭代器操作就没事。用集合操作就会出问 ...

哦哦,理解
回复 使用道具 举报
这是属于并发异常,就是说,因为迭代器是依赖集合存在的,集合自己做了删除操作,而迭代器没有变化,就会抛异常,这个解决就是,你使用迭代器遍历那么就用迭代器进行操作集合,即要么都用迭代器,要么都用集合。不知道明白没有,视频中会讲解到!
回复 使用道具 举报

他的倒数第二句是错的,在用迭代器遍历集合时,是不能用集合中的remove()方法操作集合数据的,只能用Iterator中的remove()方法,

点评

没有错的,在keySet迭代器中是可以使用所迭代的Set集合的remove()的,不可以用原来的Map集合的remove()方法,你再看看api中的解释吧~  发表于 2015-1-22 17:26
回复 使用道具 举报 0 1
yumin 中级黑马 2015-1-21 02:37:29
9#
ben_vs_cong 发表于 2015-1-20 22:12
这是属于并发异常,就是说,因为迭代器是依赖集合存在的,集合自己做了删除操作,而迭代器没有变化,就会抛 ...

明白,说得很清楚,谢谢
回复 使用道具 举报
楼上都是大婶
回复 使用道具 举报
还没学集合  来看看
回复 使用道具 举报
本帖最后由 银离子 于 2015-1-23 14:46 编辑
天堂雨 发表于 2015-1-20 09:32
你可以查看API中关于keySet的说明:“返回此映射中包含的键的 Set 视图。该 set 受映射支持,所以对映射的 ...

鄙人不才,请解释如下代码??
  1. import java.util.Iterator;
  2. import java.util.Set;
  3. import java.util.TreeMap;

  4. public class IterText {

  5.         /**
  6.          * @param args
  7.          */
  8.         public static void main(String[] args) {
  9.                 // TODO Auto-generated method stub
  10.                 TreeMap<Integer, String> hm = new TreeMap<Integer, String>();
  11.                 hm.put(55, "a");
  12.                 hm.put(64, "b");
  13.                 hm.put(74, "c");
  14.                 hm.put(85, "d");
  15.                 hm.put(97, "e");

  16.                 Set<Integer> st = hm.keySet();//键集合
  17.                 Iterator<Integer> it = st.iterator();// 迭代器

  18.                 while (it.hasNext()) {
  19.                         int buf = it.next().intValue();
  20.                         if (buf == 74) {
  21.                                 
  22.                                 st.remove(buf);// st集合中的方法,使用此方法抛出java.util.ConcurrentModificationException 异常     请解释??????
  23.                                 // it.remove();//st集合返回的迭代器,此方法不抛异常
  24.                         }

  25.                 }
  26.                 System.out.println(hm.size());

  27.                 Set<Integer> sst = hm.keySet();
  28.                 Iterator<Integer> itt = sst.iterator();// 新迭代器
  29.                 // 打印集合
  30.                 while (itt.hasNext()) {
  31.                         Integer i = itt.next();
  32.                         System.out.println(i + "=" + hm.get(i));

  33.                 }

  34.         }
  35. }
复制代码
回复 使用道具 举报
银离子 发表于 2015-1-23 14:44
鄙人不才,请解释如下代码??

好吧,你是大神,受教了~~:handshake 是我误解那里面的意思了,它的意思是得到的set中的方法可以删除map的映射,但是在迭代的过程中只能用迭代器的remove方法。
回复 使用道具 举报
天堂雨 发表于 2015-1-26 17:18
好吧,你是大神,受教了~~ 是我误解那里面的意思了,它的意思是得到的set中的方法可以删除map ...

ListIterator接口吧,可以完成迭代过程中删除数据~~~~iterator就不行了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马