Collection中的一个小问题

时间:2022-02-28 17:36:12
当使用Iterator来迭代访问Collection集合元素时,Collection集合里的元素不能被改变,只有通过Iterator的remove()来删除上一次next()方法返回的集合元素才可以。否则将会引发java.util.ConcurrentModificationException异常。

     例如:

    public class IteratorDemo{

           public static void main(String[] args){

                  Collection books=new HashSet();

                  books.add("a");

                  books.add("b");

                  Iterator it=books.iterator();

                  while(it.hasNext()){

                        String book=(String) it.next();

                        if(book.equals("b")){

                               books.remove(book);//使用Iterator迭代过程中,不可修改集合元素,此句代码异常

                               it.remove();//从集合中删除上一次next()返回的元素

                        }

                        book="c";//对迭代变量进行赋值,但集合里的元素不会改变。因此,当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素本身传给迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本身没有任何改变。

                 }

          }

     }

       上面这种错误在多线程编程时尤其容易发生:程序的一条线程正在迭代访问Collection集合元素时,另一条线程修改了Collection集合,这就会导致发生异常。


      注意:这里所谓的“从集合中删除上一次next()返回的元素就是指  if(book.equals("b"))中的b,即这里就是将b从集合中删除。


      除了使用Iterator迭代访问Collection集合之外,JDK1.5提供的foreach循环来迭代访问集合元素更加便捷。

      例如:上面代码可改为

      

 public class ForeachDemo{

           public static void main(String[] args){

                  Collection books=new HashSet();

                  books.add("a");

                  books.add("b");

                  for(object obj:books){

                        String book=(String)  obj;//此处的book变量本身也不是集合元素本身,只是存放集合元素的值

                        if(book.equals("b")){

                                books.remove(book);//此处与上面类似,也会引发ConcurrentModificationException异常

                        }

                  }

           }