`
guhanjie
  • 浏览: 298675 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

为什么java中迭代过程中不能添加或修改元素

    博客分类:
  • Java
阅读更多
为什么java中迭代过程中不能加元素
有这样的情况:
List<Integer> list = new ArrayList<Integer>();
list.add(0);
Iterator<Integer> iterator = list.iterator();
while(iterator.hasNext()) {
    int i = iterator.next();
    if(i = 0) {
          list.add(1);
          list.remove(0);
     }
}
...

此时系统编译执行会抛出异常!!!为什么呢?
百度网友(Irreappearablehttp://zhidao.baidu.com/question/395975852.html)答:
逻辑上讲,迭代时可以添加元素,但是一旦开放这个功能,很有可能造成很多意想不到的情况。
比如你在迭代一个ArrayList,迭代器的工作方式是依次返回给你第0个元素,第1个元素,等等,假设当你迭代到第5个元素的时候,你突然在ArrayList的头部插入了一个元素,使得你所有的元素都往后移动,于是你当前访问的第5个元素就会被重复访问。
java认为在迭代过程中,容器应当保持不变。因此,java容器中通常保留了一个域称为modCount,每次你对容器修改,这个值就会加1。当你调用iterator方法时,返回的迭代器会记住当前的modCount,随后迭代过程中会检查这个值,一旦发现这个值发生变化,就说明你对容器做了修改,就会抛异常。

分析透彻,说得很好。

另可以参考这里: http://blog.sina.com.cn/s/blog_60cc33d70100omhm.html

针对这个问题,这里我提出两个解决方案:
1. 另再新建一个列表B,复制原列表的内容,然后就可以在原列表迭代的时候,操作这个新建的拷贝列表B
2. 可以不用Iterator迭代器,采用for循环来遍历列表,如:
import java.util.ArrayList;
import java.util.List;

public class TestListIterator {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<Integer> list = new ArrayList<Integer>();
		list.add(0);
		for(int i=0; i<list.size() && i<5 ; i++) {
			list.add(i+1);
		}
		System.out.println(list);
	}

}
分享到:
评论

相关推荐

    java集合-CopyOnWriteArraySet的使用

    只读迭代:由于写时复制的机制,CopyOnWriteArraySet 的迭代器是只读的,即迭代过程中不会抛出 ConcurrentModificationException 异常。但是,迭代器获得的数据可能不包含最新的修改。 较高的内存占用:由于每次...

    java 面试题 总结

    java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 3、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或内置...

    java集合-ConcurrentSkipListSet的使用

    ConcurrentSkipListSet 是Java中的一个线程安全的有序集合类,它基于跳表(Skip List)数据结构实现。 下面是关于 ConcurrentSkipListSet 的一些重要信息: 线程安全性:ConcurrentSkipListSet 是线程安全的,可以...

    ArrayList.java

    此类的返回的迭代器 iterator和listIterator方法是快速失败的 :如果列表在任何时间从结构上修改创建迭代器之后,以任何方式,除了通过迭代器自身的remove或add方法,迭代器都将抛出ConcurrentModificationException...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    JDKAPI18CN(中文版)

    (结构修改是添加或删除一个或多个元素的任何操作,或明确调整后台数组的大小;仅设置元素的值不是结构修改。)这通常是通过在一些自然地封装了列表。 如果没有这样的对象存在,列表应该使用Collections....

    Java系列ArrayList

    ArrayList ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除...修改元素 删除元素 计算大小 迭代数组列表 其他的引用类型 ArrayList 排序 Java ArrayList 方法

    超级有影响力霸气的Java面试题大全文档

     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或...

    达内 coreJava 习题答案

    其中a为1至9之中的一个数,项数也要可以指定。 import java.util.Scanner; class Multinomial{ public static void main(String[] args){ int a; //定义输入的 a int howMany; //定义最后的一项有多少个数字 ...

    习----题-Java-Web程序设计教程-[共2页].pdf

    学习本章知识, 你要深刻理解集合原理以及各种集合的区别:为什么有那么多类型不同的集合。其实,各种集合 使用场合是不一样的,因此,要注意区分 Set、List 和 Map 接口之间的异同。在 Java EE 中对数据 进行存储时...

    java范例开发大全源代码

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置...

    java范例开发大全

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    java课程实验

    例如索引为i,在每次迭代中,将matrix[i]指向一个新的整数数组,其长度为i。然后用索引变量j,对数组中的每一个元素进行循环。在每次内部循环中,将matrix[i][j]赋值为(i*j)。 3) 通过循环打印matrix中的所有元素...

    Java范例开发大全 (源程序)

    第1篇 Java编程基础  第1章 Java开发环境的搭建(教学视频:9分钟) 2  1.1 理解Java 2  1.2 搭建Java所需环境 3  1.2.1 下载JDK 3  1.2.2 安装JDK 4  1.2.3 配置环境 5  1.2.4 测试JDK配置是否成功 7...

    Java范例开发大全(全书源程序)

    Java范例开发大全(全书源程序),目录如下: 第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境...

    java范例开发大全(pdf&源码)

    第1篇 Java编程基础 第1章 Java开发环境的搭建(教学视频:9分钟) 2 1.1 理解Java 2 1.2 搭建Java所需环境 3 1.2.1 下载JDK 3 1.2.2 安装JDK 4 1.2.3 配置环境 5 1.2.4 测试JDK配置是否成功 7 实例1 开发第一个Java...

    二十三种设计模式【PDF版】

    (我们不能总是使用别人设定好的框架,为什么不能有我们自己的框架?) 因此,首先你必须掌握 GoF 的设计模式。虽然它是隐性,但不是可以越过的。 关于本站“设计模式” Java 提供了丰富的 API,同时又有强大的...

    xml入门教程/xml入门教程

    EMPTY:元素内容为空时才写(空元素,其中不能有内容) &lt;!ELEMENT studinfo EMPTY&gt;(无子元素) ANY:元素内容可以任意,也可以为空 &lt;!ELEMENT studinfo ANY&gt; 混合内容:标记文本和可析字符串 2.元素属性表...

Global site tag (gtag.js) - Google Analytics