【Java基础】List迭代并修改时出现的ConcurrentModificationException问题

现在有一个需求,要遍历一个List,假设List里面存储的是String对象,然后该需求事判断里面如果有某个对象,则添加一个新的对象进去。自然,我们得出下面的代码:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;/*** Created by lili on 15/11/13.*/
public class Test {public static void main(String[] args) {List list = new ArrayList();list.add("lucy");list.add("polo");list.add("shery");//Exception in thread "main" java.util.ConcurrentModificationExceptionIterator it = list.iterator();while (it.hasNext()){String str = (String)it.next();if(str.equals("polo")){list.add("pony");}}}
}

但是该段代码会报错:ConcurrentModificationException,在API中查询这个异常,解释如下:

public class ConcurrentModificationException
extends RuntimeException
当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。例如,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。注意,此异常不会始终指出对象已经由不同 线程并发修改。如果单线程发出违反对象协定的方法调用序列,则该对象可能抛出此异常。例如,如果线程使用快速失败迭代器在 collection 上迭代时直接修改该 collection,则迭代器将抛出此异常。注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败操作会尽最大努力抛出 ConcurrentModificationException。因此,为提高此类操作的正确性而编写一个依赖于此异常的程序是错误的做法,正确做法是:ConcurrentModificationException 应该仅用于检测 bug。从以下版本开始:
1.2

从这个异常的说明来看,这种异常还不单单对List,是对所有的Collection容器(List,Set),如果在迭代的时候有修改,则都会出现。

那怎样才能解决这个问题呢?

  1. 用迭代器自身去添加对象,但是要利用ListIterator进行添加:Iterator只有hashNext,next和remove方法,而ListIterator有add和向前遍历的方法。
  2. 改用for循环来遍历判断并添加。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;/*** Created by lili on 15/11/13.*/
public class Test {public static void main(String[] args) {List list = new ArrayList();list.add("lucy");list.add("polo");list.add("shery");//Exception in thread "main" java.util.ConcurrentModificationException
//        Iterator it = list.iterator();
//        while (it.hasNext()){
//            String str = (String)it.next();
//            if(str.equals("polo")){
//                list.add("pony");
//            }
//        }
ListIterator listIt = list.listIterator();while (listIt.hasNext()){String str = (String) listIt.next();if(str.equals("polo")){listIt.add("pony");}if(str.equals("shery")){listIt.add("keity");}}System.out.println(list);for(int i = 0; i < list.size(); i++){if(list.get(i).equals("polo")){list.add("pony");}if(list.get(i).equals("shery")){list.add("keity");}}System.out.println(list);}
}

但是从打印的结果来看,这两种添加还是有区别的,第一种方式是在当前遍历元素后面添加,第二种是在最后面追加。

[lucy, polo, pony, shery, keity]
[lucy, polo, pony, shery, keity, pony, keity]Process finished with exit code 0

 

转载于:https://www.cnblogs.com/gslyyq/p/4964975.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

tp5框架原理详解_TP5框架安全机制实例分析

本文实例讲述了TP5框架安全机制。分享给大家供大家参考&#xff0c;具体如下&#xff1a;防止sql注入1、查询条件尽量使用数组方式&#xff0c;具体如下&#xff1a;$wheres array();$wheres[account] $account;$wheres[password] $password;$User->where($wheres)->f…

碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告

半人马来袭&#xff01;碧蓝航线将于8月20日9:00~11:00对安卓、iOS全港区进行为期2小时的改造建设&#xff0c;维护后将开启限时活动「盛夏的半人马座」&#xff0c;一起来看看吧。一、内容新增1.开启限时活动「盛夏的半人马座」&#xff0c;活动时间8月20日维护后~8月30日&…

MySQL安装与设置

下载zip&#xff0c;配置 1&#xff0c;系统变量添加&#xff1a;...\mysql-5.7.10-winx64,环境变量添加&#xff1a;%MYSQL_HOME%\bin 2&#xff0c;修改MySQL.ini basedir&#xff08;同系统变量路径&#xff09; datadir&#xff08;系统变量路径\data&#xff09; port 33…

后端把Long类型的数据传给前端,前端可能会出现精度丢失的情况,以及解决方案...

后端把Long类型的数据传给前端&#xff0c;前端可能会出现精度丢失的情况。例如&#xff1a;201511200001725439这样一个Long类型的整数&#xff0c;传给前端后会变成201511200001725440。 解决方法&#xff1a; 方法一&#xff1a;在后台将这个Long类型的字段转换成String类型…

传奇服务端各文件用途说明

MirServer(服务器目录)├DBServer(数据库服务端)│ ├Connection│ ├FDB(人物数据库&#xff0c;数据库格式为传奇自定义格式)│ ├Log(角色选择服务端日志)│ ├!AddrTable.txt(IP地址配置)│ ├!IdList.txt(交费账号列表&#xff0c;!Setup.exe中ServiceModeTRUE时起作用)│…

认证服务器协议,基于口令的客户端/服务器认证协议

摘要&#xff1a;Identity authentication is the precondition for secure communication between the client and the server. Kim and Chung presented a mutual authentication scheme for client/server scene. The authors realized the mutual authentication with the …

印章仿制工具_仿制图章工具怎么用

在日常生活中&#xff0c;有时候我们需要帐单表格上的文字&#xff0c;用PS的防制图章工具&#xff0c;可以十分方便快捷的处理出来。我想最恨学霸的就是学渣了吧&#xff0c;因为他们每次考试成绩都是科科满分。是家长嘴里别人家的孩子。那么今天就教学渣一个神技能&#xff0…

java日期的运用(DateUtils工具类)

public static void main(String[] args) { Date now new Date(); SimpleDateFormat sd new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("------当前时间--------&#xff1a;" sd.format(now)); //年: 加、减操作 System.out.…

1、rbac权限组件-初识, 中间件校验1

1、权限组件rbac 1、什么是权限 1 项目与应用 2 什么是权限&#xff1f; 一个包含正则表达式url就是一个权限 who what how ---------->True or Flase 2、版本1&#xff1a;用户表与权限url表 对应关系 # 版本1UserInforname pwdpermissionmodels.manytomany(Permissi…

html中视频播放完后可以跳到另一个html

2&#xff1a;jquery 的例子如下$(document).ready(function(){$("#audioId").bind(ended, function(){location.href"other.html";});});转载于:https://www.cnblogs.com/mailan/p/4972123.html

实现打印异常日志_老生常谈SpringAop日志收集与处理做的工具包

场景 :使用Spring Aop拦截参数日志目前大部分做法都基本上大同小异,不想日后每个项目工程都写一份这样的Aop拦截处理日志的代码,甚至代码侵入。我想知道一些相对重要的请求方法的请求参数,响应参数,请求头,以及内部耗时,方法是成功还是失败等等信息。发生错误时我也不知道执行到…

服务器128g内存显示64g,64g内存服务器

64g内存服务器 内容精选换一换华为云帮助中心&#xff0c;为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档&#xff0c;帮助您快速上手使用华为云服务。接口名称GetCloudPhoneServerModelsGetCloudPhoneServerModels功能描…

[LeetCode]--71. Simplify Path

Given an absolute path for a file (Unix-style), simplify it. For example, path “/home/”, > “/home” path “/a/./b/../../c/”, > “/c” click to show corner cases. Corner Cases: Did you consider the case where path “/../”? In this case, …

IOPLL动态重配

连接 Avalon -MM接口 mgmt_waitrequest:当 PLL 重配置进程开始后&#xff0c;此端口变高并在 PLL 重配置期间保持高电平。 PLL 重配置进程完成后&#xff0c;此端口变低。 I/O PLL重配写操作步骤&#xff1a; 1、 为mgmt_address和mgmt_writedata设置有效值&#xff0c;并且…

android 的属性动画

public void zyluoti(View v){ValueAnimator animator ValueAnimator.ofFloat(0,screenHeight - mImageView.getHeight());//设置属性动画的值&#xff0c;值的类型为floatanimator.setDuration(1000);//动画的作用时间animator.setTarget(mImageView);//设置动画的作用目标an…

qt中如何模拟按钮点击_如何快速在 Shopify 中加入按钮

假如你会 CSS , HTML , JS 三件套&#xff0c;那么修改 Shopify 代码将不会太难&#xff08;毕竟一个模板中的代码量还是挺多的&#xff0c;除非深入研究了代码&#xff0c;不然改起来还是会比较麻烦的&#xff09;。但挺多玩家是不会这三件套的&#xff0c;修改代码来达到添加…

clear ,refresh,free

itab 即是内表也是工作区的情况下&#xff0c;即with header line. clear itab&#xff0c;仅清空HEADER LINE&#xff0c;对内表数据存储空间不影响&#xff0c;保留内存区。 refresh itab&#xff0c;不清空HEADER LINE&#xff0c;清除内表数据存储空间&#xff0c;但保存内…

浅谈关于java中的深浅拷贝

一.浅拷贝(shallow copy) 1.如何实现浅拷贝? Object类 是所有类的直接或间接父类,Object中存在clone方法,如下 protected native Object clone() throws CloneNotSupportedException; 如果想要使一个类的对象能够调用clone方法 ,则需要实现Cloneable接口, 并重写 clone方法: p…

iOS开发-Protocol协议及委托代理(Delegate)传值

前言&#xff1a;因为Object&#xff0d;C是不支持多继承的&#xff0c;所以很多时候都是用Protocol&#xff08;协议&#xff09;来代替。Protocol&#xff08;协议&#xff09;只能定义公用的一套接口&#xff0c;但不能提供具体的实现方法。也就是说&#xff0c;它只告诉你要…

git 查看分支编码_12个常用的Git命令,赶紧记一波!

今天齐姐简单讲下 Git 的实现原理&#xff0c;知其所以然才能知其然&#xff1b;并且梳理了日常最常用的 12 个命令&#xff0c;分为三大类分享给你。本文的结构如下&#xff1a;作者和开发原由Git 的数据模型常用命令资源推荐作者和开发原由Talk is cheap. Show me the code.这…