Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我不能在一个相等的列表中使用相同的方法有两个循环?JAVA_Java_Multithreading_List_Concurrency_Exception Handling - Fatal编程技术网

为什么我不能在一个相等的列表中使用相同的方法有两个循环?JAVA

为什么我不能在一个相等的列表中使用相同的方法有两个循环?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++

我正在学习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++){
    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);}}代码会很好地运行,当然,改变第二个循环使用迭代器是可行的,尽管你再次添加每个元素,这看起来很奇怪。你真的理解这些答案吗?