处理Java ArrayList的ConcurrentModificationException问题ITeye快报 - 凯发娱乐

处理Java ArrayList的ConcurrentModificationException问题ITeye快报

2019-01-31 09:54:15 | 作者: 景明 | 标签: 运用,办法,调用 | 浏览: 4417

  工作中运用ArrayList的场景许多,其间遍历ArrayList的过程中删去其间元素的状况信任也不少,并且信任许多人都会遇到ConcurrentModificationException反常。咱们来研究一下为何会抛这个反常,并拟定解决办法。

在jdk5之后有5种遍历并删去的写法:

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
public class ListRemoveTest { 
 public static void main(String[] args) { 
 ListRemoveTest test = new ListRemoveTest(); 
 System.out.println("-1-运用jdk5.0今后的增强for循环去remove"); 
 List String list = test.buildList(); 
 try { 
 for (String str : list) { 
 list.remove(str); 
 } catch (Exception e) { 
 // java.util.ConcurrentModificationException 
 e.printStackTrace(); 
 System.out.println("-2-运用Iterator的remove"); 
 list = test.buildList(); 
 try { 
 Iterator String iterator = list.iterator(); 
 while (iterator.hasNext()) { 
 iterator.next(); 
 iterator.remove(); 
 } catch (Exception e) { 
 // java.lang.IllegalStateException 
 e.printStackTrace(); 
 System.out.println("-3-iterator遍历+list的remove"); 
 try { 
 list = test.buildList(); 
 for (Iterator String iterator = list.iterator(); iterator.hasNext();) { 
 String str = (String) iterator.next(); 
 list.remove(str); 
 } catch (Exception e) { 
 // java.util.ConcurrentModificationException 
 e.printStackTrace(); 
 System.out.println("-4-运用list的remove(int)办法. [由后向前删去]"); 
 list = test.buildList(); 
 for (int i = list.size(); i i) { 
 list.remove(i - 1); 
 System.out.println("-5-运用list的remove(int)办法. [由前向后删去]"); 
 list = test.buildList(); 
 for (int i = 0; i list.size(); i++) { 
 list.remove(0); 
 private List String buildList() { 
 List String list = new ArrayList String 
 list.add("a"); 
 list.add("b"); 
 list.add("c"); 
 return list; 



运转成果:
-1-运用jdk5.0今后的增强for循环去remove 
java.util.ConcurrentModificationException 
-2-运用Iterator的remove 
-3-iterator遍历+list的remove 
 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:781) 
 at java.util.ArrayList$Itr.next(ArrayList.java:753) 
 at com.jdk.ListRemoveTest.main(ListRemoveTest.java:14) 
java.util.ConcurrentModificationException 
 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:781) 
 at java.util.ArrayList$Itr.next(ArrayList.java:753) 
 at com.jdk.ListRemoveTest.main(ListRemoveTest.java:39) 
-4-运用list的remove(int)办法. [由后向前删去] 
-5-运用list的remove(int)办法. [由前向后删去] 


2,4,5运转正常,1,3抛出
java.util.ConcurrentModificationException


原因剖析:
1,3都是因为list的长度改动,Iterator履行next()办法时,调用checkForComodification()时犯错,1,3是同一个问题,这两个办法remove操作都是履行的是ArrayList中的remove办法,根本原因在于expectedModCount与modCount他们的不相等,因为履行了ArrayList中的remove(),modCount在每一次循环值会发作改动,而expectedModCount并没有发作,在履行checkForComodification()办法就会抛出反常。
2之所以正确运转是因为调用了Iterator的remove办法,4,5不会履行checkForComodification()操作,所以不会呈现这种反常。

定论:
在履行remove()不要将ArrayList 与Iterator混合运用,独自运用Iterator以及ArrayList的删去都是OK的

注意事项:
在运用Iterator的时分,必须先调用next()来获取第一个元素,不然调用remove()的时分会抛IllegalStateException过错。
版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表凯发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2
  • 3

    rails 对 URL的一些处理sina

    办法,途径,地址
  • 4
  • 5
  • 6

    Obsolete特点sohu

    特点,正告,运用
  • 7
  • 8

    JAVA根底 之 JDBCITeyetengxun

    数据库,根底,运用
  • 9
  • 10