Search code examples
javaconcurrentmodification

How to add values to a list while iterating it


I Have a scenario such like this

List<String> xxx = new ArrayList
for(String yyy : xxx){
   for(String zzz:xyxy){
     if(!zzz.equals(yyy)){
       xxx.add(zzz);
     }
   }
}

But i get java.util.ConcurrentModificationException: null exception.Can anyone help me solve this issue.? Can anyone give me alternate method to perform this ?


Solution

  • Looking at the ArrayList API:

    The iterators returned by this class's iterator and listIterator methods are fail-fast: if the list is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove or add methods, the iterator will throw a ConcurrentModificationException.

    So you're going to need to explicitly get a ListIterator and use that to properly alter your ArrayList. Also, I don't believe you can use a for-each loop because the iterators in those are separate from your explicitly retrieved iterator. I think you'll have to use a while loop:

    List<String> xxx = new ArrayList<>();
    ListIterator<String> iterator = xxx.listIterator();
    while (iterator.hasNext()) {
        String s = iterator.next();
        for (String zzz : xyxy) {
            if (!zzz.equals(s)) {
                iterator.add(zzz); //<-- Adding is done through the iterator
            }
        }
    }