`

ArratyList 遍历 删除 ConcurrentModificationException

阅读更多

 

遍历删除List中的元素有很多种方法,当运用不当的时候就会产生问题。下面主要看看以下几种遍历删除List中元素的形式:

1.通过增强的for循环删除符合条件的多个元素

2.通过增强的for循环删除符合条件的一个元素

3.通过普通的for删除删除符合条件的多个元素

4.通过Iterator进行遍历删除符合条件的多个元素

 

 

Java代码  收藏代码
  1. /** 
  2.  * 使用增强的for循环 
  3.  * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException 
  4.  */  
  5. public void listRemove() {  
  6.     List<Student> students = this.getStudents();  
  7.     for (Student stu : students) {  
  8.         if (stu.getId() == 2)   
  9.             students.remove(stu);  
  10.     }  
  11. }  

 

 

Java代码  收藏代码
  1. /** 
  2.  * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常 
  3.  */  
  4. public void listRemoveBreak() {  
  5.     List<Student> students = this.getStudents();  
  6.     for (Student stu : students) {  
  7.         if (stu.getId() == 2) {  
  8.             students.remove(stu);  
  9.             break;  
  10.         }  
  11.     }  
  12. }  

 

 

Java代码  收藏代码
  1. /** 
  2.  * 这种遍历有可能会遗漏某个元素,因为删除元素后List的size在 
  3.  * 变化,元素的索引也在变化,比如你循环到第2个元素的时候你把它删了, 
  4.  * 接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。当访问的元素 
  5.  * 索引超过了当前的List的size后还会出现数组越界的异常,当然这里不会出现这种异常, 
  6.  * 因为这里每遍历一次都重新拿了一次当前List的size。 
  7.  */  
  8. public void listRemove2() {  
  9.     List<Student> students = this.getStudents();  
  10.     for (int i=0; i<students.size(); i++) {  
  11.         if (students.get(i).getId()%3 == 0) {  
  12.             Student student = students.get(i);  
  13.             students.remove(student);  
  14.         }  
  15.     }  
  16. }  

 

 

Java代码  收藏代码
  1. /** 
  2.  * 使用Iterator的方式也可以顺利删除和遍历 
  3.  */  
  4. public void iteratorRemove() {  
  5.     List<Student> students = this.getStudents();  
  6.     System.out.println(students);  
  7.     Iterator<Student> stuIter = students.iterator();  
  8.     while (stuIter.hasNext()) {  
  9.         Student student = stuIter.next();  
  10.         if (student.getId() % 2 == 0)  
  11.             stuIter.remove();//这里要使用Iterator的remove方法移除当前对象,如果使用List的remove方法,则同样会出现ConcurrentModificationException  
  12.     }  
  13.     System.out.println(students);  
  14. }  

 

 

附完整代码如下:

 

Java代码  收藏代码
  1. import java.util.ArrayList;  
  2. import java.util.Iterator;  
  3. import java.util.List;  
  4.   
  5. public class ListRemove {  
  6.   
  7.     public static void main(String args[]) {  
  8.         ListRemove lr = new ListRemove();  
  9.         lr.listRemove();  
  10.         lr.listRemoveBreak();  
  11. //      lr.listRemove2();  
  12. //      lr.iteratorRemove();  
  13.     }  
  14.   
  15.     /** 
  16.      * 使用增强的for循环 
  17.      * 在循环过程中从List中删除元素以后,继续循环List时会报ConcurrentModificationException 
  18.      */  
  19.     public void listRemove() {  
  20.         List<Student> students = this.getStudents();  
  21.         for (Student stu : students) {  
  22.             if (stu.getId() == 2)   
  23.                 students.remove(stu);  
  24.         }  
  25.     }  
  26.       
  27.     /** 
  28.      * 像这种使用增强的for循环对List进行遍历删除,但删除之后马上就跳出的也不会出现异常 
  29.      */  
  30.     public void listRemoveBreak() {  
  31.         List<Student> students = this.getStudents();  
  32.         for (Student stu : students) {  
  33.             if (stu.getId() == 2) {  
  34.                 students.remove(stu);  
  35.                 break;  
  36.             }  
  37.         }  
  38.     }  
  39.       
  40.     /** 
  41.      * 这种不使用增强的for循环,每次重新获取list的size遍历的情况运行时不会报错,但是可能删除的结果是错的。 
  42.      */  
  43.     public void listRemove2() {  
  44.         List<Student> students = this.getStudents();  
  45.         for (int i=0; i<students.size(); i++) {  
  46.             if (students.get(i).getId()%2 == 0)  
  47.                 students.remove(i);  
  48.         }  
  49.     }  
  50.       
  51.     /** 
  52.      * 使用Iterator的方式也可以顺利删除和遍历 
  53.      */  
  54.     public void iteratorRemove() {  
  55.         List<Student> students = this.getStudents();  
  56.         System.out.println(students);  
  57.         Iterator<Student> stuIter = students.iterator();  
  58.         while (stuIter.hasNext()) {  
  59.             Student student = stuIter.next();  
  60.             if (student.getId() % 2 == 0)  
  61.                 stuIter.remove();  
  62.         }  
  63.         System.out.println(students);  
  64.     }  
  65.       
  66.     private List<Student> getStudents() {  
  67.         List<Student> students = new ArrayList<Student>() {  
  68.             {  
  69.                 int i = 0;  
  70.                 while (i++ < 10) {  
  71.                     Student student = new Student(i, "201200" + i, "name_" + i);  
  72.                     this.add(student);  
  73.                 }  
  74.             }  
  75.         };  
  76.         return students;  
  77.     }  
  78. }  

 

 

Java代码  收藏代码
  1. public class Student {  
  2.   
  3.     private int id;  
  4.     private String stuNo;  
  5.     private String name;  
  6.       
  7.     public Student() {  
  8.           
  9.     }  
  10.       
  11.     public Student(int id, String stuNo, String name) {  
  12.         this.id = id;  
  13.         this.stuNo = stuNo;  
  14.         this.name = name;  
  15.     }  
  16.   
  17.     public int getId() {  
  18.         return id;  
  19.     }  
  20.   
  21.     public void setId(int id) {  
  22.         this.id = id;  
  23.     }  
  24.   
  25.     public String getStuNo() {  
  26.         return stuNo;  
  27.     }  
  28.   
  29.     public void setStuNo(String stuNo) {  
  30.         this.stuNo = stuNo;  
  31.     }  
  32.   
  33.     public String getName() {  
  34.         return name;  
  35.     }  
  36.   
  37.     public void setName(String name) {  
  38.         this.name = name;  
  39.     }  
  40.   
  41.     @Override  
  42.     public String toString() {  
  43.         return "Student [id=" + id + ", name=" + name + ", stuNo=" + stuNo  
  44.                 + "]";  
  45.     }  
  46.       
  47. }
  48. 转载:http://haohaoxuexi.iteye.com/blog/1523785
分享到:
评论

相关推荐

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    当你在一个迭代器正在遍历集合的过程中添加或删除元素时,就会抛出这个异常。这个问题在单线程环境下不会出现,但在多线程并发场景下,如果多个线程同时修改一个集合,就可能导致`ConcurrentModificationException`...

    HashMap和List遍历方法及如何遍历删除元素总结

    增强for循环是Java语法糖的一种体现,但是使用这种方法遍历删除元素也会出现问题,运行时会报ConcurrentModificationException异常。原因在于,在增强for循环中,实际上是使用Iterator来遍历List,而Iterator并不能...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    在Java编程中,遍历并删除集合(如List或Set)中的元素是一项常见的操作,但如果不正确地执行,可能会导致`ConcurrentModificationException`异常。这个异常通常在尝试修改正在迭代的集合时出现,因为Java的集合迭代...

    Java HashMap 如何正确遍历并删除元素的方法小结

    这段代码将抛出 `java.util.ConcurrentModificationException` 异常,因为在遍历 HashMap 的元素过程中删除了当前所在元素,下一个待访问的元素的指针也由此丢失了。 2. 正确的删除方法 正确的删除方法是使用迭代...

    java哈希遍历_哈希遍历_

    - 在多线程环境下,不要在遍历过程中修改HashMap,否则可能会抛出`ConcurrentModificationException`。如果需要在遍历中修改,可以使用`Iterator.remove()`方法,或者使用`CopyOnWriteArrayMap`等线程安全的集合。 -...

    如何遍历一个java集合

    在面试中,除了基本的遍历方式,还可能考察一些高级话题,如并发遍历(ConcurrentModificationException)、性能优化(如避免在循环中调用`size()`方法)以及如何处理null元素等。同时,理解不同集合类的底层实现和...

    java.util.ConcurrentModificationException 异常问题详解1

    这个示例代码尝试在遍历 ArrayList 时删除其中的一个元素,这将导致 ConcurrentModificationException 异常。 那么,为什么会抛出这个异常呢?我们可以通过查看 ArrayList 的源码来了解原因。ArrayList 的 iterator...

    正确遍历删除List中的元素方法(推荐)

    在Java编程中,遍历并删除List中的元素是一项常见的操作,但如果不小心处理,可能会遇到错误,如`ConcurrentModificationException`。以下是几种常见的遍历删除List元素的方法及其注意事项: 1. **通过增强的for...

    java-遍历map

    - 在遍历`Map`时,如果在遍历过程中尝试修改`Map`(例如添加或删除元素),可能会引发`ConcurrentModificationException`异常。因此,在遍历的同时不要修改`Map`。 - 使用流API遍历时,虽然代码更简洁,但性能上可能...

    【Java面试题】List如何一边遍历,一边删除?

    在Java编程中,遍历并删除List集合是一个常见的操作,但在实际编程中,如果不使用正确的方法,可能会导致`java.util.ConcurrentModificationException`异常。本文主要针对这个面试题,详细讲解如何在遍历List的同时...

    Java list利用遍历进行删除操作3种方法解析

    Java list利用遍历进行删除操作3种方法解析 Java list 是一种常用的数据结构,经常被用来存储和操作数据。在 Java 中,对 list 进行遍历和删除操作是一种常见的需求。本文将介绍 Java list 利用遍历进行删除操作的 ...

    java集合类遍历的同时如何进行删除操作.docx

    在Java编程中,集合类遍历的同时进行删除操作是一个常见的需求,但如果不正确地执行,可能会导致`ConcurrentModificationException`。这个问题主要出现在迭代器正在遍历集合时,集合本身被修改的情况。以下是对这个...

    Iterator遍历过程中list删除导致异常

    然而,当我们尝试在使用`Iterator`遍历集合的过程中直接修改集合时,可能会遇到`ConcurrentModificationException`异常。这个异常通常发生在多线程环境下对共享数据进行并发修改,但即使在单线程情况下,如果在迭代...

    Java中遍历ConcurrentHashMap的四种方式详解

    使用Iterator遍历ConcurrentHashMap可以避免ConcurrentModificationException的出现。这种方式的优点是可以安全地遍历Map的内容,并且可以在遍历过程中修改Map的内容。但是,需要注意的是,使用Iterator遍历需要手动...

    使用Iterator接口遍历集合元素

    hasNext() 方法用于判断集合中是否还有未被遍历的元素,next() 方法用于返回集合中的下一个元素,remove() 方法用于删除集合中的上一个元素。 Iterator 接口主要用于遍历集合元素,而不是提供盛装对象的能力。因此...

    Java遍历集合方法分析(实现原理、算法性能、适用场合)_.docx

    - **迭代器遍历**适用于需要遍历多种不同类型集合,且不希望暴露底层实现的场合,同时,它支持在遍历过程中删除元素。 - **foreach循环**则适用于代码简洁性优先,且不需要在遍历过程中修改集合的场景。 在性能方面...

    java中List对象集合的遍历方法(三个)

    如果在遍历过程中需要移除元素,必须使用`it.remove()`,直接调用`list.remove()`会导致并发修改异常(ConcurrentModificationException)。 ### 第二种:增强型for循环(foreach) ```java for (A a : list) { /...

    Java 实例 - HashMap遍历源代码-详细教程.zip

    - 遍历HashMap时修改HashMap(添加、删除元素)可能会导致`ConcurrentModificationException`,因为迭代器无法检测到这种并发修改。 - 使用`keySet()`遍历并删除元素是安全的,但效率较低,因为这涉及到两次查找:...

    Java ArrayList遍历修改代码实例解析

    然而,在遍历 ArrayList 时,如果需要删除某些元素,可能会遇到 ConcurrentModificationException 异常。今天,我们将讨论如何正确地遍历和修改 ArrayList。 遍历 ArrayList 的正确方法 在遍历 ArrayList 时,不能...

    java遍历Map的几种方法分析

    注意,这种方式如果在遍历过程中删除键,可能会导致迭代器抛出`ConcurrentModificationException`异常。 4. **通过`entrySet()`遍历** 类似地,如果需要同时访问键和值,但不希望使用for-each循环,也可以使用`...

Global site tag (gtag.js) - Google Analytics