21、List遍历时修改元素的问题
List迭代时修改元素的问题
请编写代码完成以下需求:
判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。‘
package com.monkey1024.list; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; /**
* 判断一个List里面是否包含monkey,如果包含的话,向集合中添加1024这个字符串。
*
*/
//通过注解去除黄色警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ListTest02 { public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("monkey");
list.add("d");
list.add("e"); Iterator iter = list.iterator();
while(iter.hasNext()) {
String str = (String)iter.next();//ConcurrentModificationException并发修改异常
if(str.equals("monkey")) {
list.add("1024");
}
}
}
}
上面代码在向list中添加完元素之后再执行到String str = (String)iter.next();这行时,报出ConcurrentModificationException异常,通过ArrayList的源码可以看到,当modCount不等于expectedModCount时才会报出这个异常,上面代码在遍历集合时添加了一个元素,这样就修改了集合中的元素个数,所以会导致modCount不等于expectedModCount,这样就会报出ConcurrentModificationException异常。
如果想要解决上面的问题,需要使用ListIterator去遍历,并且使用ListIterator向List中添加元素
package com.monkey1024.list; import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator; /**
* 使用ListIterator解决ConcurrentModificationException
*
*/
// 通过注解去除黄色警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ListTest02 { public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("monkey");
list.add("d");
list.add("e"); // 使用ListIterator解决上面的问题
ListIterator listIter = list.listIterator();
while (listIter.hasNext()) {
String str = (String) listIter.next();
if (str.equals("monkey")) {
// 使用list迭代器向集合中添加元素
listIter.add("1024");
}
}
System.out.println(list);
}
}
ListIterator中方法简介
在ListIterator中有个previous()和hasPrevious()方法,通过这两个方法,可以将集合中的元素倒序遍历。需要注意的是在倒序遍历之前要将集合先正序遍历。
package com.monkey1024.list; import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator; /**
* ListIterator
*
*/
//通过注解去除黄色警告
@SuppressWarnings({ "rawtypes", "unchecked" })
public class ListIteratorTest01 { public static void main(String[] args) { List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("c");
list.add("d");
list.add("e"); ListIterator listIter = list.listIterator();
while(listIter.hasNext()) {
System.out.println(listIter.next());//获取元素并将指针向后移动
} System.out.println("-----------------"); while(listIter.hasPrevious()) {
System.out.println(listIter.previous()); //获取元素并将指针向前移动
}
}
}
21、List遍历时修改元素的问题的更多相关文章
- List集合遍历时修改元素出现并发修改异常总结
什么是并发修改异常: 当我们在遍历实现了collection接口与iterator接口的集合时(List.Set.Map), 我们可以通过遍历索引也可以通过迭代器进行遍历.在我们使用迭代器进行遍历集合 ...
- 【原理探究】女朋友问我ArrayList遍历时删除元素的正确姿势是什么?
简介 我们在项目开发过程中,经常会有需求需要删除ArrayList中的某个元素,而使用不正确的删除方式,就有可能抛出异常.或者在面试中,会遇到面试官询问遍历时如何正常删除元素.所以在本篇文章中,我们会 ...
- java list集合遍历时删除元素
转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...
- 【Java】List遍历时删除元素的正确方式
当要删除ArrayList里面的某个元素,一不注意就容易出bug.今天就给大家说一下在ArrayList循环遍历并删除元素的问题.首先请看下面的例子: import java.util.ArrayLi ...
- golang遍历时修改被遍历对象
目录 前言 遍历切片 遍历map 总结 前言 很多时候需要将遍历对象中去掉某些元素,或者往遍历对象中添加元素,这时候就需要小心操作了. 对于go语言中的一些注意事项我做了总结和示例,留下点笔记. 遍历 ...
- java 集合list遍历时删除元素
本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...
- Java遍历时删除List、Set、Map中的元素(源码分析)
在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...
- 分析轮子(八)- List.java 各种遍历方式及遍历时移除元素的方法
注:玩的是JDK1.7版本 1:先尝栗子,再分析,代码简单,注释清晰,可自玩一下 /** * @description:测试集合遍历和移除元素的方式 * @author:godtrue * @crea ...
- 不要在遍历子结点时修改parent
[不要在遍历子结点时修改parent] 在用for/foreach遍历子结点时,如果在这过程中有改变子结点的parent,会导致不可预料的结果.我所遇到的问题是,在此种情况下,并非所有的子结点都能遍历 ...
随机推荐
- js 时间处理函数 获取今天的前几天和后几天的任意一天
var now = new Date(); let today = now.getFullYear() + '-' + (now.getMonth() + 1) + '-' + now.getDa ...
- centos7防火墙操作
启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : s ...
- macOS & SVN
macOS & SVN mac 下已经自带了svn环境; 使用 svn –version 查看版本号 安装方法: 已安装 XCode,只需要在 code > Preferences &g ...
- 是否升级IOS11?IOS11不支持32位程序 查看手机哪些APP不支持
查看苹果32位APP具体步骤:设置-通用-关于本机-应用程序.如果手机中下载了32位应用的话,苹果会给出应用兼容性提醒:如果手机里没有安装32位应用,右侧没有小三角,点击“应用程序”也会没有反应. I ...
- C# 实例化类的执行顺序
先进行细分: 类的成员分为:字段.属性.方法.构造方法 成员的修饰符:静态成员.实例成员 层次结构:父类.子类 先不考虑继承关系,执行顺序为: 静态字段 静态构造方法 实例字段 实例构造方法 属性和方 ...
- css 样式 文字过长 换行处理方法
css强制换行.强制不换行及自动换行的写法 css强制不换行 div{white-space:nowrap;} css自动换行 div{ word-wrap: break-word; word-bre ...
- 纯css实现长宽等比例的div
现代网站页面基本都需要响应式,一个div的长宽往往我们都设置为百分之多少,这个百分之是相对于父容器动态计算的 这样在浏览器宽度变化之后,我们的元素也能自动更新长宽.例如:我们在页面上摆了一个div,这 ...
- BZOJ2079 [Poi2010]Guilds 【贪心】
题目链接 BZOJ2079 题解 题意就是黑白染色,要求相邻点存在不同颜色的点 显然从一个点出发,相邻点如果没有染色,染不同颜色,那么一个联通块一定会满足要求 证明:在\(dfs\)树上,每个点父亲和 ...
- 【bzoj4031】[HEOI2015]小Z的房间 解题报告
[bzoj4031][HEOI2015]小Z的房间 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含\(n*m\)个格子的格状矩形,每个格子是一个房 ...
- 解题:USACO14MAR Counting Friends
题面 枚举每个数字是否能被删去,然后就是如何判定图是否存在.应该从按“度数”从大到小排序,从最大的顺次向其他点连边(先连“度数”小的可能会把一些可以和大“度数”点连接的点用掉).但是这个排序每连一次都 ...