黑马程序员技术交流社区
标题:
关于集合类中迭代器使用类集本身方法的问题
[打印本页]
作者:
申俊伟
时间:
2012-9-6 18:21
标题:
关于集合类中迭代器使用类集本身方法的问题
本帖最后由 申俊伟 于 2012-9-6 21:13 编辑
List<String> allList=new ArrayList<String>();//创建ArrayList实例
//向其中增加元素
allList.add("hello");
allList.add( "world");
allList.add("heima");
allList.add("itcast.cn");
Iterator<String> it=allList.iterator();//创建迭代器
while(it.hasNext()){
String str=it.next();
if("heima".equals(str))
{
<font color="Red">// it.remove();
allList.remove(str);//删除元素</font>
}
else
{
System.out.print(str+",");
}
}
复制代码
(标红的代码)!上述代码使用it.remove()方法,即注释了的语句(使用的迭代器中的方法)后程序输出正常,但使用ArrayList中的方法allList.remove(str)方法后只能输出[hello,world,],但itcast.cn没有被删除啊,为什么没有输出?不是这两种方法都能删除集合中的元素吗?
作者:
武庆东
时间:
2012-9-6 18:23
本帖最后由 武庆东 于 2012-9-6 18:42 编辑
List<String> allList=new ArrayList<String>();//创建ArrayList实例
//向其中增加元素
allList.add("hello");
allList.add( "world");
allList.add("heima");
allList.add("itcast.cn");
Iterator<String> it=allList.iterator();//创建迭代器
while(it.hasNext()){
String str=it.next();
if("heima".equals(str))
{
<font color="Red">// it.remove();
代号1
allList.remove(str);//删除元素</font>
代号2
}
else
{
System.out.print(str+",");
}
}
(标红的代码)!上述代码使用it.remove()方法,即注释了的语句(使用的迭代器中的方法)后程序输出正常,但使用ArrayList中的方法allList.remove(str)方法后只能输出[hello,world,],但itcast.cn没有被删除啊,为什么没有输出?不是这两种方法都能删除集合中的元素吗?
在进行集合的迭代输出时不能进行remove()操作,编译时不报错,运行时会报告
ConcurrentModificationException 异常!
你这个在运行时没有报错,是因为it.remove()至始至终都没有进行实际操作
作者:
黑马-刘心武
时间:
2012-9-6 19:00
Iterator 是工作在一个独立的线程中,并且线程同步。
Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
所以 Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象, Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性, 所以当你使用it.remove()时,得到正确的结果.
作者:
AngieFans85
时间:
2012-9-6 19:43
用迭代器遍历的时候,处于线程同步的状态,只能使用迭代器的remove()方法来删除容器中的元素.
这是个知识点,记住就是了.
作者:
张飞年
时间:
2012-9-6 21:14
二楼说的比较好。简单来说Iterator迭代器就是一个因定的映射,一旦确定就不好再进行改动(当然自身带有三个方法可以使用,如果想有更多的操作,比如增加,可以使用它的子类ListIterator),如果不是调用Iterator自身方法而使用集合方法就会抛出ConcurrentModificationException同步异常。
你的问题是你用it.remove();可正常操作,使用allList.remove()时会先产生异常,会直接中断跳出。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2