ConcurrentModificationException并发修改异常
程序员文章站
2022-04-18 17:19:02
...
首先先看三种遍历
1.普通for循环 :
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
System.out.println(student);
}
2.增强for循环:
for (Student student : list) {
System.out.println(student);
}
3.迭代器
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()){
输出 iterator.next();
关于list遍历过程中,能否增加或者删除数据,看代码实现.
package com.qf.demo;
import java.util.ArrayList;
import java.util.Iterator;
public class Test3 {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
String string= "01#张三#20*02#李四#18*03#王五#22*04#赵六#20*05#田七#21";
String[] strings = string.split("[*]");
for (int i = 0; i < strings.length; i++) { // i = 0 01#张三#20
// 01, 张三, 20
String[] strings2 = strings[i].split("[#]");
Student student = new Student(strings2[0], strings2[1], Integer.parseInt(strings2[2]));
list.add(student);
}
System.out.println(list);
for (Student student : list) {
System.out.println(student);
}
for (int i = 0; i < list.size(); i++) {
Student student = list.get(i);
System.out.println(student);
}
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()){
Student student = iterator.next();
if(student.getName().equals("田七")){
System.out.println(student);
}
}
// 将 小于 20 的全删除
//test(list);
test2(list);
}
// 将 小于 20 的全删除
public static void test(ArrayList<Student> list){
// for (Student student : list) {
// if(student.getAge()<20){
// list.remove(student);// ConcurrentModificationException 并发修改异常
// }
// }
//增强for循环 迭代器
/**
* 1 给集合创建一个副本
* 2 遍历的是副本
*
* 为什么不能进行增删操作 是因为在遍历副本的过程中 改变了 原来集合的长度
*
*
* 在遍历集合的过程中 不要使用 list.remove
* list.add()
*
* ConcurrentModificationException
* 都会改变集合的长度
*/
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()){
Student student = iterator.next();
if(student.getAge()<=20){
// list.add(new Student("000", "ergou", 18));
// list.remove(student);
iterator.remove();
}
}
System.out.println(list);
}
/**
* 用普通 for 循环 在集合 遍历过程中 增加或者删除数据
* 虽然不会报异常 但是会有遍历不到的元素
*
* 三种迭代方式中 都不允许 在遍历过程中 增加元素
* 删除元素 只有 迭代器可以
* @param list
*/
public static void test2(ArrayList<Student> list){
// 5
// size 4 i = 1 删除
// size 3 i= 2
// size 2 i= 3
for(int i = 0;i<list.size();i++){
if(list.get(i).getAge()<=20){
list.remove(list.get(i));
}
}
System.out.println(list);
}
}
推荐阅读
-
Oracle查看和修改连接数(进程/会话/并发等等)
-
java 集合并发操作出现的异常ConcurrentModificationException
-
python监控网站运行异常并发送邮件的方法
-
C#解决SQlite并发异常问题的方法(使用读写锁)
-
Oracle查看和修改连接数(进程/会话/并发等等)
-
List并发修改异常的产生和解决
-
《C#并发编程经典实例》学习笔记—2.9 处理 async void 方法的异常
-
Java集合中迭代器遍历过程的并发修改异常问题(Debug模式追踪)
-
java 集合并发操作出现的异常ConcurrentModificationException
-
关于java List的remove方法导致的异常java.util.ConcurrentModificationException