I have below two java class
import java.util.*;
public class ArrayListTest032 {
    public static void main(String[] ar) {
        List<String> list = new ArrayList<String>();
        list.add("core java");
        list.add("php");
        list.add("j2ee");
        list.add("struts");
        list.add("hibernate");
        Iterator<String> itr = list.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
        list.remove("php");
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }
}
When I run above code I get below output.
core java
php
j2ee
struts
hibernate
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
    at java.util.AbstractList$Itr.next(AbstractList.java:343)
    at ArrayListTest032.main(ArrayListTest032.java:20)
Which is expected as I am modifying the list while iterating. But in below java class same logic is executed by set family.
import java.util.*;
public class HashSetTest021 {
    public static void main(String[] ar) {
        Set<String> set = new HashSet<String>();
        set.add("core java");
        set.add("php");
        set.add("j2ee");
        set.add("struts");
        set.add("hibernate");
        Iterator<String> itr = set.iterator();
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
        set.remove("php");
        while (itr.hasNext()) {
            System.out.println(itr.next());
        }
    }
}
And out put is.
hibernate
core java
j2ee
php
struts
There is no any ConcurrentModificationException.
I just want to know why same piece of code throws  ConcurrentModificationException in case of list family, but there is no any ConcurrentModificationException in case of set family
 
     
     
     
     
     
    