Iterator为什么不能对容器的进行添加或修改操作(可以删除)
来源:互联网 发布:淘宝卖家不说话怎么办 编辑:程序博客网 时间:2024/04/27 18:07
为什么java中迭代过程中不能添加或修改元素
为什么java中迭代过程中不能加元素
有这样的情况:
此时系统编译执行会抛出异常!!!为什么呢?
逻辑上讲,迭代时可以添加元素,但是一旦开放这个功能,很有可能造成很多意想不到的情况。
比如你在迭代一个ArrayList,迭代器的工作方式是依次返回给你第0个元素,第1个元素,等等,假设当你迭代到第5个元素的时候,你突然在ArrayList的头部插入了一个元素,使得你所有的元素都往后移动,于是你当前访问的第5个元素就会被重复访问。
java认为在迭代过程中,容器应当保持不变。因此,java容器中通常保留了一个域称为modCount,每次你对容器修改,这个值就会加1。当你调用iterator方法时,返回的迭代器会记住当前的modCount,随后迭代过程中会检查这个值,一旦发现这个值发生变化,就说明你对容器做了修改,就会抛异常。
有这样的情况:
- 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);
- }
- }
- ...
此时系统编译执行会抛出异常!!!为什么呢?
逻辑上讲,迭代时可以添加元素,但是一旦开放这个功能,很有可能造成很多意想不到的情况。
比如你在迭代一个ArrayList,迭代器的工作方式是依次返回给你第0个元素,第1个元素,等等,假设当你迭代到第5个元素的时候,你突然在ArrayList的头部插入了一个元素,使得你所有的元素都往后移动,于是你当前访问的第5个元素就会被重复访问。
java认为在迭代过程中,容器应当保持不变。因此,java容器中通常保留了一个域称为modCount,每次你对容器修改,这个值就会加1。当你调用iterator方法时,返回的迭代器会记住当前的modCount,随后迭代过程中会检查这个值,一旦发现这个值发生变化,就说明你对容器做了修改,就会抛异常。
0 0
- Iterator为什么不能对容器的进行添加或修改操作(可以删除)
- 对XML文件进行的添加、删除、修改、查询操作。
- C#对DataGridView中的数据进行添加、修改、删除操作
- 对DataGridView进行添加、修改、删除数据操作----C#
- 用WebService实现对数据库进行操作(添加+删除+修改)
- C#对DataGridView进行添加修改删除操作
- 通过ICursor对Table进行操作(添加、修改、删除)
- C#对DataGridView进行添加、修改、删除数据操作
- Easyui Tree对节点进行,添加,修改,删除操作
- ShopEx customSchema 定制可以根据客户的需求对网站进行相应功能的添加修改或者删除
- java中对列表的添加或删除操作
- .net 对xml文件的读写,添加,修改,删除操作
- c# 文件操作 对文件的添加 修改 删除
- mysql对表字段的操作【添加,修改,删除】
- Js操作表格-对表格单元格的添加删除修改
- C#对DataGridView中的数据进行添加、修改、删除操作c#操作datatable
- 天涯论坛为什么不能删除或修改自己发表的贴子
- 解决VC6.0中对类的变量或函数进行了添加或删除操作后,可能导致在类视图中看不到该类的问题
- 教你十分钟快速搭建springBoot项目实战
- hadoop HDFS存储原理
- 操作系统(1)—操作系统概述
- 第二章 UI开发——Android 布局类型
- mac 上面安装并且启动mongodb
- Iterator为什么不能对容器的进行添加或修改操作(可以删除)
- 什么是Mixin模式:带实现的协议
- Arrays.copyOf
- 技术支持信息
- USACO-Prime Palindromes(部分筛法判素数,回文数生成)
- cocospod 安装和使用
- Hibernate空指针异常
- 7.SPL数据结构简介
- 如何在本机编译openthos环境,适用与Ubuntu16.04