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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马姗姗 中级黑马   /  2014-1-13 21:18  /  1289 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 马姗姗 于 2014-1-14 16:30 编辑

当使用Iterator遍历一个list集合时,通过Object o = iterator.next(),这时如果使用list.remove(o),就会抛出ConcurrentModificationException,但是使用iterator.remove(),就没有问题,一个问题困扰了好久,希望有朋友帮我解决下...

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 神马都是浮云

查看全部评分

4 个回复

正序浏览
本帖最后由 DOOR 于 2014-1-13 21:59 编辑

导致的原因是:
集合引用和迭代器引用在同时操作元素,通过集合获取到对应的迭代器后,在迭代中,进行集合引用的元素移除,迭代器并不知道,所以会出现异常情况。
解决方法:
既然是在迭代中对元素进行操作,找迭代器的方法最为合适.可是Iterator中只有hasNext,next,remove方法.它的子接口ListIterator,该列表迭代器接口具备了对元素的增、删、改、查的动作。
ListIterator是List集合特有的迭代器。
ListIterator it = list.listIterator;//取代Iterator it = list.iterator;

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 ixiangfeng 于 2014-1-13 21:37 编辑

并发修改异常,集合的方法和迭代器的方法不能同时进行,否则会抛出此异常,假如你迭代之前是3个元素,在迭代时,当你迭代了第一个元素然后用集合的remove方法删除了后面一个,这时迭代器又不知道,它还继续迭代后面的两个元素,但这时元素被删除了一个......所以用Iterator迭代时只能用它里面的三个方法

如果你想要像上面那样做的话可以用Iterator的子接口ListIterator,它里面有很多方法可以做到

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
是的,当我们用迭代器去迭代集合的时候,是不能再用集合对象去操作集合的。解决办法由两种:一个是用迭代器去操作集合,二是用普通for循环去操作集合。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
当集合被迭代时,如果在使用了迭代器的对集合的操作方法,就不能使用集合的操作方法,否则就会抛出异常。
解决办法,要么,在迭代集合的过程中,全部使用迭代器中的方法,要么 全部使用集合的方法。

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

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