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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张榆 中级黑马   /  2012-9-24 10:24  /  1956 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

迭代器的弊端:用迭代器在迭代过程中对集合的元素进行操作,是不被允许的。所以可以用ListIterator。
现在发现,如果用Iterator在迭代过程中删除,竟然是可以的。而如果是添加,就不可以。代码如下,请问为什么?
Iterator<String> iter = alist.iterator();
  while (iter.hasNext()) {
   String str= iter.next();
   if (str.equals("kko")) {
  alist.add("cc");//error   java.util.ConcurrentModificationException
    iter.remove();
   }
  }

评分

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

查看全部评分

5 个回复

倒序浏览
其实吧...
当年毕老师讲的是迭代过程中,
要不在迭代器中用迭代器方法操作,
要不不用迭代器,而是用List本身的方法错作。
二者只能选一,
迭代器中List的方法错作,会引发并发操作异常。
我操作的好好的,加啊减啊的,你进来给我偷偷加一下减一下,我能受得了吗?
回复 使用道具 举报
现在发现,如果用Iterator在迭代过程中删除,竟然是可以的。而如果是添加,就不可以。代码如下,请问为什么?
这两行代码是你自己写的
alist.add("cc");//error   java.util.ConcurrentModificationException-------------------------------因为在迭代器中,而他调用的是集合的方法,不被允许,抛异常
    iter.remove();-------------------------------------------------------------------------------------------------因为在迭代器中,而他调用的是迭代器的方法,所以不抛异常

评分

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

查看全部评分

回复 使用道具 举报
Collection接口都是通过Iterator()(即迭代器)来对Set和List遍历。
通过语句:Iterator it=c.iterator(); 得到一个迭代器,将集合中所有元素顺序排列。然后可以通过interator方法进行遍历,迭代器有一个游标(指针)指向首位置。
Interator有hasNext(),用于判断元素右边是否还有数据,返回True说明有。然后就可以调用next动作。Next()会将游标移到下一个元素,并把它所跨过的元素返回。(这样就可以对元素进行遍历)
其一本省iterator就提供了remove(),next(),hasNext() 三个方法,就没有add()这个方法!
其二
Iterator<String> iter = alist.iterator();
  while (iter.hasNext()) {//多次循环,判断iter里面有没有数据
   String str= iter.next();
   if (str.equals("kko")) {

    iter.remove(); //而你在这里如果不加if,就相当于没循环一次就会移除,会报错的
   }
1)ListIterator继承Iterator接口,所以它封装了更多的抽象方法!
2)ListIterator有add()方法,可以向List中添加对象,而Iterator不能。
3)ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator 没有此功能。
4)都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。

评分

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

查看全部评分

回复 使用道具 举报
对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。
迭代器与枚举有两点不同:

    1.迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素
    2.方法名称得到了改进.

     当在集合中添加元素的时候,这个时候又要操作的是取出的元素,迭代器会发生错乱,为了保证正确性,单线程并发操作的时候也会抛出此异常。
回复 使用道具 举报
郭阳 发表于 2012-9-24 16:28
现在发现,如果用Iterator在迭代过程中删除,竟然是可以的。而如果是添加,就不可以。代码如下,请问为什么 ...

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