黑马程序员技术交流社区
标题:
迭代器的一些疑问
[打印本页]
作者:
Amu
时间:
2015-5-30 23:54
标题:
迭代器的一些疑问
当迭代器去集合元素进行迭代时,当调用集合方法对集合进行增加或删除元素时,会发生并发修改异常,但
用集合方法对元素进行修改时并不会发生异常,这是为什么类
作者:
我本灬无名
时间:
2015-5-31 00:05
看码。。。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class CollectionTest1 {
public static void main(String[] args) {
List list = new ArrayList();
list.add( "hello");
list.add ("world");
// Iterator it =list.iterator();
// while(it.hasNext()){
// String s = (String) it.next();
// if("hello".equals(s)){
// list.add("IOS");
// }
ListIterator it =list.listIterator();
while(it.hasNext()){
String s = (String) it.next();
if("hello".equals(s)){
it.add("IOS");
}
}System.out.println(list);
}
}
复制代码
因为第一种使用List里面add方法添加元素。集合变了,而迭代器并没有修改。所以并发修改异常
作者:
我本灬无名
时间:
2015-5-31 00:06
手贱,提交了。。
第二种,是用迭代器 it 本身的 add方法添加。这时候的元素是添加到遍历的元素后边的,所以木有异常。
作者:
微凉的暮色
时间:
2015-5-31 00:14
:victory:
我再乱说一句,迭代器运行后会有一个自己的缓存数据,利用自己增删方法时,会连集合内一起修改
但如果只是集合方法的话 迭代器来不及COPY ,所以一生气就挂了
作者:
想要那片海
时间:
2015-5-31 07:51
因为迭代器通过原集合的iterator 方法获取的,hasNaxt 方法是在判断迭代器中是否还有下一个元素,next 是在获取下一个可以迭代的元素,如果你在迭代获取元素的过程增删,就导致现有的集合和原有集合元素数量的不一致,hasNext 和next 有可能就迭代不到相应的元素,我是这么理解的
作者:
武汉小菜鸟
时间:
2015-5-31 23:56
我是这么理解的:在迭代的过程当中,对元素进行修改并不会破坏迭代器指针的指向,如果进行增删是话,只能使用迭代器的remove进行删除,不能使用集合的增删方法,因为会改变迭代器指针的指向,(对于无序的set)可能会使一个数据迭代了多次,引发迭代异常
若果理解有误,大家可以探讨一下
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2