1

I am learning Java's Collection framework. I wrote this little program to check why we can't use For-each to remove elements.

Code:

import java.util.ArrayList;

class intro{
    public static void main(String args[]){
        ArrayList<String> names = new ArrayList<String>();
        names.add("Rajat");
        names.add("Saxena");

        for(String name:names){
            names.remove(name);
        }

        for(String name:names){
            System.out.println(name);
        }
    }
}

Outputs:

Saxena

And

import java.util.ArrayList;

class intro{
    public static void main(String args[]){
        ArrayList<String> names = new ArrayList<String>();
        names.add("Rajat");
        names.add("Saxena");
        names.add("Arvind");

        for(String name:names){
            names.remove(name);
        }

        for(String name:names){
            System.out.println(name);
        }
    }
}

Throws:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
    at java.util.ArrayList$Itr.next(ArrayList.java:831)
    at intro.main(intro.java:15)

How come just the addition of one more element to collection is causing the error?

Rajat Saxena
  • 3,834
  • 5
  • 45
  • 63

1 Answers1

2

Normally when you remove an element from a collection while looping over the collection, you'll get a ConcurrentModificationException. This is partially why the Iterator interface has a remove() method. Using an iterator is the only safe way to modify a collection of elements while traversing them. The code would go something like this:

ArrayList<String> names = new ArrayList<String>();
    names.add("Rajat");
    names.add("Saxena");
    names.add("Arvind");
for (Iterator<String> iterator = name.iterator(); iterator.hasNext();) {
           String string = iterator.next();
           if (string.isEmpty()) {
                 iterator.remove();
}
}
Sanshayan
  • 1,076
  • 1
  • 11
  • 16