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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 阿萨德大圣 中级黑马   /  2014-11-25 18:47  /  1475 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在集合使用迭代器listiterator遍历时如果去操作数据就会报错
                Iterator it = list.iterator();
                 while (it.hasNext()) {
                 String s = (String) it.next();
                 if ("hello".equals(s)) {
                 list.add("word");//好像是这一步引起的,是为什么呢
                 }
                 }
                 System.out.println("list:" +  list);

7 个回复

正序浏览
本帖最后由 爽亮前程 于 2014-11-25 22:15 编辑

同学你好:
你这样做会引起:ConcurrentModificationException   并发修改异常
原因为使用迭代器的过程中不可以对集合进行操作,具体原因可以查看源码:
你可以这样修改:


1:
  1. for (int x = 0; x < list.size(); x++) {
  2.                         String s = list.get(x);
  3.                         if ("hello".equals(s)) {
  4.                                 list.add(x + 1, "word");
  5.                         }
  6.                 }
  7.                 System.out.println("list:" + list);
复制代码


2:

ListIterator it = list.listIterator();
  while (it.hasNext()) {
   String s = (String) it.next();
   if ("hello".equals(s)) {
    it.add("word");
   }
  }
  System.out.println("list:" + list);





回复 使用道具 举报
并发修改异常么?是因为修改了集合的长度而迭代器没有改变才出的错……
回复 使用道具 举报
cbb 中级黑马 2014-11-25 21:27:05
地板
想要增加的话要用特有的迭代器 ListIterator
回复 使用道具 举报
本帖最后由 kerner 于 2014-11-25 23:31 编辑

你这样写是,取得集合的迭代器后,在对迭代器进行操作时,不能再的集合进行增删,因为会影响迭代器的判断,迭代器有两个索引与集合相关,分别指向当前和末尾,具体怎么影响可以看源代码。不过你可以这样写:
               Iterator it = list.iterator();
                 while (list.iterator().hasNext) {
                 String s = (String) list.iterator().next();
                 if ("hello".equals(s)) {
                 list.add("word");//好像是这一步引起的,是为什么呢
                 }
                 }
                 System.out.println("list:" +  list);
这样不会影响,但是是一直循环的,
改正:上面的方法不行,我又犯了不该犯的错误。
回复 使用道具 举报
在迭代过程中是不可以使用集合的方法操作集合的,list集合可以用list特有迭代器ListIterator进行迭代,在迭代过程中使用ListIterator的方法实现添加、修改和删除操作
回复 使用道具 举报
Iterator只有hasNext,next,remove方法而没有add。想要使用add只有其子类ListIterator才有。
所以把Iterator it=list.iterator();改成ListIterator it=list.listIterator();
回复 使用道具 举报
这个iterator迭代器在迭代过程中不支持 对数据的操作  可以用Listiterator 试试  好像是这样的的:lol
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马