为什么在代码的指定位置出现ConcurrentModificationException?我无法弄清楚自己在做什么错… removeMin()正在使用该方法在列表中找到分钟pq,将其删除并返回其值
removeMin()
pq
import java.util.Iterator; import java.util.LinkedList; public class test1 { static LinkedList<Integer> list = new LinkedList<Integer>(); public static void main(String[] args) { list.add(10); list.add(4); list.add(12); list.add(3); list.add(7); System.out.println(removeMin()); } public static Integer removeMin() { LinkedList<Integer> pq = new LinkedList<Integer>(); Iterator<Integer> itPQ = pq.iterator(); // Put contents of list into pq for (int i = 0; i < list.size(); i++) { pq.add(list.removeFirst()); } int min = Integer.MAX_VALUE; int pos = 0; int remPos = 0; while (itPQ.hasNext()) { Integer element = itPQ.next(); // I get ConcurrentModificationException here if (element < min) { min = element; remPos = pos; } pos++; } pq.remove(remPos); return remPos; } }
一旦修改了从其获得的Collection,则不应认为Iterator可用。(对于java.util.concurrent。*集合类,放宽了此限制。)
您首先要获得一个Iterator pq,然后进行修改pq。修改之后pq,Iterator itPQ不再有效,因此当您尝试使用它时,您会收到ConcurrentModificationException。
itPQ
一种解决方案是Iterator<Integer> itPQ = pq.iterator();在while循环之前向右移动。更好的方法是完全不使用Iterator:
Iterator<Integer> itPQ = pq.iterator();
while
for (Integer element : pq) {
从技术上讲,for-each循环在内部使用Iterator,因此无论哪种方式,此循环仅在您不尝试pq在循环内进行修改时才有效。