Why does one loop throw a ConcurrentModificationException, while the other doesn't?

后端 未结 5 1668
余生分开走
余生分开走 2020-12-16 18:40

I\'ve run into this while writing a Traveling Salesman program. For an inner loop, I tried a

for(Point x:ArrayList) {
// modify the iterator
}         


        
相关标签:
5条回答
  • 2020-12-16 19:23

    The first example uses an iterator, the second does not. It is the iterator that checks for concurrent modification.

    0 讨论(0)
  • 2020-12-16 19:24

    You cannot modify a List while you are iterating over it which you are doing in the first example. In the second you simply have a regular for loop.

    0 讨论(0)
  • 2020-12-16 19:29

    the first code is using an iterator so modifying the collection is not allowed. The second code you are accessing each object with x.get(i), so not using an iterator, modifications thus are allowed

    0 讨论(0)
  • 2020-12-16 19:41

    As others explained, the iterator detects modifications to the underlying collection, and that is a good thing since it is likely to cause unexpected behaviour.

    Imagine this iterator-free code which modifies the collection:

    for (int x = 0; list.size(); x++)
    {
      obj = list.get(x);
      if (obj.isExpired())
      {
        list.remove(obj);
        // Oops! list.get(x) now points to some other object so if I 
        // increase x again before checking that object I will have 
        // skipped one item in the list
      }
    }
    
    0 讨论(0)
  • 2020-12-16 19:43

    If you run the code and observe you find that first iteration of the loop works fine but the second throws ConcurrentModicationException

    if is because next() method checks if the number of the elements did not change.

    For nice explanation see http://javaadami.blogspot.com/2007/09/enhanced-for-loop-and.html

    0 讨论(0)
提交回复
热议问题