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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贾振凯 中级黑马   /  2013-3-26 20:02  /  1427 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 贾振凯 于 2013-3-27 20:16 编辑
  1. Collection<String> collection = new TreeSet<String>();
  2.                 collection.add("jzk");
  3.                 collection.add("rfl");
  4.                 collection.add("lft");
  5.                 Iterator<String> li = collection.iterator();
  6.                 while(li.hasNext()){
  7.                         String key = li.next();
  8.                         if(key.equals("rfl")){
  9.                                 collection.remove(key);//试了一下,只有HashSet会产生异常
  10.                         }
  11.                         System.out.println(key);
复制代码
这段程序:
collection =new TreeSet<String>()的时候打印结果是
jzk
lft
rfl
***********************************************************************8
collection =new HashSet<String>()的时候打印结果是
lft
rfl
Exception in thread "main" java.util.ConcurrentModificationException
*******************************************************************************
collection =new ArrayList<String>()或者 LinkedList<String>()的时候打印结果是
jzk
rfl

怎么会出现这么个情况,我还以为都会出现ConcurrentModificationException异常!





点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-27 19:58

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

1 个回复

正序浏览
collection实际上存储的是对象的内存地址,操作内存地址的方法有两种,一种是迭代器,一种是collection的方法,使用iterator的时候,就不能使用collection去操作,简单来说,同一资源,两个同时调用,必定会发生问题。iterator中确实有remove()方法,所以应该这么改:
collection.remove(key);
改成:
li.remove(key);就可以了

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马