为什么我不能在一个相等的列表中使用相同的方法有两个循环?JAVA
我正在学习Java8认证,我发现了一件不可思议的事情 我正在参加一个课程,在解释Java中的列表时,他谈到了ConcurrentModificationException 看看这个片段:为什么我不能在一个相等的列表中使用相同的方法有两个循环?JAVA,java,multithreading,list,concurrency,exception-handling,Java,Multithreading,List,Concurrency,Exception Handling,我正在学习Java8认证,我发现了一件不可思议的事情 我正在参加一个课程,在解释Java中的列表时,他谈到了ConcurrentModificationException 看看这个片段: List<String> lista = new LinkedList<>(); lista.add("d"); lista.add("d"); lista.add("d"); lista.add("d"); for(int i = 0; i<lista.size(); i++
List<String> lista = new LinkedList<>();
lista.add("d");
lista.add("d");
lista.add("d");
lista.add("d");
for(int i = 0; i<lista.size(); i++){
System.out.println(lista.get(i));
}
for(String s : lista){
lista.add(s);
}}
List lista=new LinkedList();
列表a.添加(“d”);
列表a.添加(“d”);
列表a.添加(“d”);
列表a.添加(“d”);
for(int i=0;ifor(Element e:list)
构造在内部使用了一个迭代器,这解释了您的ConcurrentModificationException
例如,见:
编译器会在背后为您[创建迭代器
],但您不必担心它*
-->如果您打算在迭代时修改结构,那么您确实需要关注它
*为了清晰起见,方括号中的内容被“我”取代。第二个的问题是你在添加新的元素。但是第一个你只是在阅读
想象一下,你不停地数着书,有人在书的中间插入书。多么恼人啊?如果不插入新书,无论你读了多少遍,结果都不会改变。问题不在于这两个循环,而是第二个循环正在修改它所迭代的列表。第二个循环如何执行ted而第一个循环仍在迭代?这个问题背后的用例是什么?在循环该列表时不能修改列表。第二个循环本身就是问题所在。即使从代码中删除第一个循环,您仍然会得到ConcurrentModificationException。请想一想,如果您没有得到异常,您最终会得到一个异常无限循环,因为您正在向列表中添加列表中的任何内容,并且列表在不断增长。问题是不同的。请设计此场景:System.out.println(“Ciao”);//第1行System.out.println(“HI”);//第2行如果JVM不在第1行之前执行,第2行就不能执行。那么,如果第二个循环将在读取列表之后执行,为什么我要担心呢?顺便说一句,如果我使用这样的迭代器:for(iterator iterator=lista.iterator();iterator.hasNext()){lista.add(s);}}代码会很好地运行,当然,改变第二个循环使用迭代器是可行的,尽管你再次添加每个元素,这看起来很奇怪。你真的理解这些答案吗?