list在遍历过程中的add/remove

平时开发过程中,很多人估计都遇到过一个问题:在遍历集合的的过程中,进行add或者remove操作的时候,会出现2类错误,包括:
java.util.ConcurrentModificationException for in遍历过程中add/remove导致的错误
java.lang.IndexOutOfBoundsException 越界错误,for循环的时候删除元素。

那么我们应该怎样避免这个问题呢?

首先对于add操作:建议利用原生的for循环。remove操作利用foreach操作

具体代码如下:remove

add:

经典错误1:

什么错误呢?这段代码用于只会输出list的第一个元素。问题出在链式写法上。

每次循环时候先调用了list.iterator() 在该方法中每次都是重新new了一个新的对象
public Iterator<E> iterator() {
return new Itr();
}
所以每一次都是一个新的遍历对象,所以输出第一个元素。
那么为什么每次都要new一个新的Itr()?我猜想应该是为了并发的读,每次读的都是一份独立的数据,避免多个并发读的时候,出现当前指针问题。
处理办法:将list.iteraotr() 放在外面即可,保证循环中循环的是1个对象。

经典错误2:

会陷入死循环

原文地址:https://www.cnblogs.com/lucia557/p/8505085.html

时间: 2024-10-10 21:02:59

list在遍历过程中的add/remove的相关文章

List集合在遍历过程中的删除

List集合在遍历过程中的删除:[1,1,2,3,4,5] for循环正续会漏掉一个1 for(int i=0;i<list.size();i++){ if(list.get(i).equals(1)){ list.remove(i); } } for循环倒序可以删除所有1 for(int i=list.size()-1;i>=0;i--){ if(list.get(i).equals(1)){ list.remove(i); } } 迭代器和foreach遍历时删除都会报错:java.uti

Java使用foreach遍历集和时不能add/remove的原因剖析

foreach 与 Iterator 我们知道,在Java中使用foreach对集和进行遍历时,是无法对该集和进行插入.删除等操作,比如以下代码: for(Person p : personList){ if(StringUtil.isBlank(p.getName())){ personList.remove(p); } } 执行代码,报以下异常: Exception in thread "main" java.util.ConcurrentModificationException

HashSet——add remove contains方法底层代码分析(hashCode equals 方法的重写)

引言:我们都知道HashSet这个类有add   remove   contains方法,但是我们要深刻理解到底是怎么判断它是否重复加入了,什么时候才移除,什么时候才算是包括????????? add()方法 首先我们看下这个代码 1 package com.xt.set; 2 3 import java.util.HashSet; 4 import java.util.Iterator; 5 import java.util.Set; 6 7 public class AddTest { 8

Maste Note for OCR / Vote disk Maintenance Operations (ADD/REMOVE/REPLACE/MOVE)

Doc ID 428681.1 Applies to: Oracle Database - Enterprise Edition - Version 10.2.0.1 to 11.2.0.1.0 [Release 10.2 to 11.2]Information in this document applies to any platform. Goal The goal of this note is to provide steps to add, remove, replace or mo

浅析JPA中EntityManager无法remove entity的问题

今天遇到一个奇怪的事情,利用EntityManager.remove(entity)方法删除一个entity时,删不掉,也不报错.后来经过多方查证,解决了这个问题. ERD Entity定义 ------------- 第一个Entity A --------------- @Entity public class A {     @Id     private Long id;          @Column(nullable = false, unique = true, length =

eclips git中的add to Index无效解决

今天在使用eclips git中的add to Index,发现其无效,具体如下 问题描述: 通过export导入一个git java项目 在java工程中新增一个类文件IndicatorCalcTest.java 在eclips中选择该文件,team->add to Index,操作后该文件未显示+号 问题定位: 直接通过命令行进入IndicatorCalcTest.java文件所在目录,命令执行git add IndicatorCalcTest.java,报如下错误 C:\Users\Adm

修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数

1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summary> 4: /// <remarks> 5: /// 注意,调用该函数后,会使整个Web Application重启,导致当前所有的会话丢失 6: /// </remarks> 7: /// <param name="key">要修改的键key

ResultSet遍历过程中修改自身数据,不会改变循环的过程

ResultSet遍历过程中修改自身数据,不会改变循环的过程: import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class TestTbl { public static void main(String[] args) throws Exception { Connection tXdConn = Conn.getTXdConn(); String

WIX: Hide installed program from the Add/Remove Programs window.

Reference article : How to hide an entry in the Add/Remove Programs applet? In Wix source files, set property ARPSYSTEMCOMPONENT = 1 would do this, for example: <Product> <PropertyId="ARPSYSTEMCOMPONENT">1</Property> </Produ