黑马程序员技术交流社区

标题: 关于迭代器中不能使用集合方法操作同一集合元素的疑问 [打印本页]

作者: lumingbi    时间: 2014-4-13 21:01
标题: 关于迭代器中不能使用集合方法操作同一集合元素的疑问
迭代器中不能使用集合方法操作同一集合元素,我的问题是:
是否只是不能用添加(add())与删除(remove())方法,而其它的集合方法如set()方法是可以使用的?


作者: 展展    时间: 2014-4-13 21:09
java.util
接口 Iterator<E>
所有已知子接口:
ListIterator<E>, XMLEventReader

方法摘要
boolean hasNext()
          如果仍有元素可以迭代,则返回 true。
E next()
          返回迭代的下一个元素。
void remove()
          从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。



java.util
接口 ListIterator<E>
所有超级接口:
Iterator<E>

方法摘要
void add(E e)
          将指定的元素插入列表(可选操作)。
boolean hasNext()
          以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。
boolean hasPrevious()
          如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。
E next()
          返回列表中的下一个元素。
int nextIndex()
          返回对 next 的后续调用所返回元素的索引。
E previous()
          返回列表中的前一个元素。
int previousIndex()
          返回对 previous 的后续调用所返回元素的索引。
void remove()
          从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。
void set(E e)
          用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。

这是API文档上的,我只知道一般的只有remove但是list的有set
作者: 不似侽紸角.    时间: 2014-4-13 22:11
本帖最后由 不似侽紸角. 于 2014-4-13 22:34 编辑

嗯 用Iterator接口跌代的话是不能集合方法增删的,会引起并发异常
想要增删的话,需要使用Iterator的子类 ListIterator接口,方法就可以了,
就是在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生ConcurrentModificationException异常。

但set();方法不会抛异常! 因为没有改变原数组的长度。

作者: 不似侽紸角.    时间: 2014-4-13 22:30
不似侽紸角. 发表于 2014-4-13 22:11
嗯 用Iterator接口跌代的话是不能集合方法增删的,会引起并发异常
想要增删的话,需要使用Iterator的子类 L ...

不好意思,是可以使用Set();方法的,但不能增删!




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