黑马程序员技术交流社区

标题: 关于集合遍历异常的问题, [打印本页]

作者: 阿萨德大圣    时间: 2014-11-25 18:47
标题: 关于集合遍历异常的问题,
在集合使用迭代器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);
作者: superjiejie    时间: 2014-11-25 19:00
这个iterator迭代器在迭代过程中不支持 对数据的操作  可以用Listiterator 试试  好像是这样的的:lol
作者: 冥夜    时间: 2014-11-25 19:37
Iterator只有hasNext,next,remove方法而没有add。想要使用add只有其子类ListIterator才有。
所以把Iterator it=list.iterator();改成ListIterator it=list.listIterator();
作者: hailong    时间: 2014-11-25 21:09
在迭代过程中是不可以使用集合的方法操作集合的,list集合可以用list特有迭代器ListIterator进行迭代,在迭代过程中使用ListIterator的方法实现添加、修改和删除操作
作者: kerner    时间: 2014-11-25 21:18
本帖最后由 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);
这样不会影响,但是是一直循环的,
改正:上面的方法不行,我又犯了不该犯的错误。
作者: cbb    时间: 2014-11-25 21:27
想要增加的话要用特有的迭代器 ListIterator
作者: 迷失的小Z    时间: 2014-11-25 21:44
并发修改异常么?是因为修改了集合的长度而迭代器没有改变才出的错……
作者: 爽亮前程    时间: 2014-11-25 22:07
本帖最后由 爽亮前程 于 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);










欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2