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遍历时修改元素的问题的更多相关文章

  1. List集合遍历时修改元素出现并发修改异常总结

    什么是并发修改异常: 当我们在遍历实现了collection接口与iterator接口的集合时(List.Set.Map), 我们可以通过遍历索引也可以通过迭代器进行遍历.在我们使用迭代器进行遍历集合 ...

  2. 【原理探究】女朋友问我ArrayList遍历时删除元素的正确姿势是什么?

    简介 我们在项目开发过程中,经常会有需求需要删除ArrayList中的某个元素,而使用不正确的删除方式,就有可能抛出异常.或者在面试中,会遇到面试官询问遍历时如何正常删除元素.所以在本篇文章中,我们会 ...

  3. java list集合遍历时删除元素

    转: java list集合遍历时删除元素 大家可能都遇到过,在vector或arraylist的迭代遍历过程中同时进行修改,会抛出异常java.util.ConcurrentModification ...

  4. 【Java】List遍历时删除元素的正确方式

    当要删除ArrayList里面的某个元素,一不注意就容易出bug.今天就给大家说一下在ArrayList循环遍历并删除元素的问题.首先请看下面的例子: import java.util.ArrayLi ...

  5. golang遍历时修改被遍历对象

    目录 前言 遍历切片 遍历map 总结 前言 很多时候需要将遍历对象中去掉某些元素,或者往遍历对象中添加元素,这时候就需要小心操作了. 对于go语言中的一些注意事项我做了总结和示例,留下点笔记. 遍历 ...

  6. java 集合list遍历时删除元素

    本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...

  7. Java遍历时删除List、Set、Map中的元素(源码分析)

    在对List.Set.Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while.for循环或增强for.会抛出ConcurrentModificationException异常或者没有 ...

  8. 分析轮子(八)- List.java 各种遍历方式及遍历时移除元素的方法

    注:玩的是JDK1.7版本 1:先尝栗子,再分析,代码简单,注释清晰,可自玩一下 /** * @description:测试集合遍历和移除元素的方式 * @author:godtrue * @crea ...

  9. 不要在遍历子结点时修改parent

    [不要在遍历子结点时修改parent] 在用for/foreach遍历子结点时,如果在这过程中有改变子结点的parent,会导致不可预料的结果.我所遇到的问题是,在此种情况下,并非所有的子结点都能遍历 ...

随机推荐

  1. JVM 规范

    http://files.cnblogs.com/files/dragonsuc/jls8.pdf 或者官网:http://files.cnblogs.com/files/dragonsuc/jls8 ...

  2. BeanCopier

    cglib是一款比较底层的操作java字节码的框架. 下面通过拷贝bean对象来测试BeanCopier的特性: public class OrderEntity { private int id; ...

  3. Spring Cloud与微服务构建:Spring Cloud简介

    Spring Cloud简介 微服务因该具备的功能 微服务可以拆分为"微"和"服务"二字."微"即小的意思,那到底多小才算"微&q ...

  4. 【刷题】洛谷 P1519 穿越栅栏 Overfencing

    题目描述 描述 农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫.幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意 ...

  5. 【刷题】洛谷 P3950 部落冲突

    题目背景 在一个叫做Travian的世界里,生活着各个大大小小的部落.其中最为强大的是罗马.高卢和日耳曼.他们之间为了争夺资源和土地,进行了无数次的战斗.期间诞生了众多家喻户晓的英雄人物,也留下了许多 ...

  6. 【CF710F】String Set Queries(二进制分组,AC自动机)

    [CF710F]String Set Queries(二进制分组,AC自动机) 题面 洛谷 CF 翻译: 你有一个字符集合\(D\),初始为空, 有三种操作: 往\(D\)中加入一个串:从\(D\)中 ...

  7. UOJ #7 【NOI2014】 购票

    题目链接:购票 这道题我调了好久啊……主要还是因为这种用\(CDQ\)分治来搞斜率优化的题已经很久没写过了……上一次要追溯到去年暑假去了…… 看下面这些东西之前你需要先自己推出斜率优化的式子…… 这道 ...

  8. 小技巧--tab键自动补齐Git命令

    Git是什么,你不清楚? 好吧,那么该篇内容对你也木有帮助,请绕道而行.. 我们在使用Git命令时,可以通过tab键,自动补齐Git,特别是在切换分支时特别有用. 如下,当我们想将当前分支切换到bug ...

  9. SpringMVC 上传文件(文件非必填)MultipartHttpServletRequest

    原文:https://blog.csdn.net/dorothy1224/article/details/79136676 上传文件(文件非必填)MultipartHttpServletRequest ...

  10. C#线程篇---线程池如何管理线程(6完结篇)

    C#线程基础在前几篇博文中都介绍了,现在最后来挖掘一下线程池的管理机制,也算为这个线程基础做个完结. 我们现在都知道了,线程池线程分为工作者线程和I/O线程,他们是怎么管理的? 对于Microsoft ...