遍历列表时获取ConcurrentException(Getting ConcurrentException when traversing a list)

编程入门 行业动态 更新时间:2024-10-27 05:24:16
遍历列表时获取ConcurrentException(Getting ConcurrentException when traversing a list)

我处于一个非常奇特的状态。 我有一个类似下面的列表: -

List<String> list = new ArrayList<String>(); list.add("a"); list.add("b");

现在,当我执行多种遍历类型时,例如使用高级for,iterator和normal for循环,以下是示例代码片段: -

1>高级循环: -

try { for(String a : list) { System.out.println(a); list.add("f"); } } catch (Exception e) { e.printStackTrace(); }

2>迭代器: -

try { Iterator<String> itr = list.iterator(); while(itr.hasNext()) { System.out.println(itr.next()); list.add("f"); } } catch (Exception e) { e.printStackTrace(); }

3>正常循环: -

for (int i=0;i<list.size();i++) { System.out.println(list.get(i)); list.add("f"); }

现在,奇怪的问题是,当使用高级的for-loop和iterator时,我得到以下异常: -

java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) the reason i know, that while iterating through a list, one cannot modify it parallely.

但是,当我使用正常的循环,然后它正常工作,我错过了什么?

请帮忙!!!..

I am in a very peculiar state. I have a list something like below :-

List<String> list = new ArrayList<String>(); list.add("a"); list.add("b");

Now when i do multiple type of traversing, like using advanced for, iterator, and normal for loop, below are the sample code snippets :-

1> Advanced Loop :-

try { for(String a : list) { System.out.println(a); list.add("f"); } } catch (Exception e) { e.printStackTrace(); }

2> Iterator :-

try { Iterator<String> itr = list.iterator(); while(itr.hasNext()) { System.out.println(itr.next()); list.add("f"); } } catch (Exception e) { e.printStackTrace(); }

3> Normal Loop :-

for (int i=0;i<list.size();i++) { System.out.println(list.get(i)); list.add("f"); }

Now, the peculiar problem is, that when using advanced for-loop and iterator, i get the following exception : -

java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(Unknown Source) at java.util.ArrayList$Itr.next(Unknown Source) the reason i know, that while iterating through a list, one cannot modify it parallely.

but when i use the normal for loop, then it works properly, Am i missing something??

Please Help!!!..

最满意答案

如果你修改一个List,它将使从它创建的任何Iterator对象失效。 高级循环(1)编译为与迭代器循环(2)几乎相同的代码,这意味着在场景后面创建了一个Iterator对象。

ConcurrentMOdificationException的javadoc具有更多细节。

如果您想在迭代时添加,请使用

ListIterator listIter = ... while(listIter.hasNext()) { if(shouldAdd(iter.next())) { iter.add(....) } }

If you modify a List, it invalidates any Iterator objects created from it. The advanced loop (1) compiles to nearly the same code as the iterator loop (2), meaning that there is an Iterator object created behind the scenes.

The javadocs for ConcurrentMOdificationException have more details.

If you want to add while iterating, use

ListIterator listIter = ... while(listIter.hasNext()) { if(shouldAdd(iter.next())) { iter.add(....) } }

更多推荐

本文发布于:2023-08-06 17:32:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1454153.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:遍历   列表   ConcurrentException   traversing   list

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!