黑马程序员技术交流社区

标题: 集合迭代时加了个元素怎么就出现异常了 [打印本页]

作者: 七宝    时间: 2013-8-15 21:49
标题: 集合迭代时加了个元素怎么就出现异常了
本帖最后由 七宝 于 2013-8-16 01:00 编辑

public static void show() {
ArrayList<String> list= new ArrayList<String>();
list.add("a1");
list.add("a2");
list.add("a3");
Iterator<String> it = list.iterator();
while(it.hasNext()){
  list.add("a4");
  System.out.println(it.next());
  
}
迭代时怎么就出现异常了,感觉写得合情合理又合法啊


作者: 乔小北    时间: 2013-8-15 21:54
在while里面写,会不停的add,陷入死循环,我觉得是这样
作者: gudao20080    时间: 2013-8-15 23:15
我的理解是这样的
  1. import java.util.ArrayList;
  2. import java.util.Iterator;

  3. public class It {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 show();
  10.         }
  11.         public static void show() {
  12.                  ArrayList<String> list= new ArrayList<String>();
  13.                  list.add("a1");
  14.                 list.add("a2");
  15.                  list.add("a3");
  16.                  Iterator<String> it = list.iterator();//这是含有三个元素的集合的迭代器
  17.                  while(it.hasNext()){
  18.                
  19.                          list.add("a4");   //此时list中已经含有四个元素了
  20.                    System.out.println(it.next());        //集合内容已经更改了,那么它的迭代器也就无效了          
  21.                  }
  22.         }
  23. }
复制代码

作者: 神之梦    时间: 2013-8-15 23:27
这是并发操作异常
作者: funneies    时间: 2013-8-15 23:47
本帖最后由 funneies 于 2013-8-16 10:11 编辑

List集合在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生并发访问异常(ConcurrentModificationException异常)。
所以,在迭代时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出,删除操作。
如果想要其他的操作如:添加,修改等,就需要使用其 子接口ListIterator,该接口只能通过List集合的ListIterator接口获取。
  1.         public static void main(String []args){
  2.                
  3.                 ArrayList al = new ArrayList();
  4.                
  5.                 al.add("java01");
  6.                 al.add("java02");
  7.                 al.add("java03");
  8.                 al.add("java04");
  9.                 al.add("java04");

  10.                 ListIterator it = al.listIterator();
  11.                 sop(al);

  12.                 while(it.hasNext()){//正向遍历列表
  13.                         Object obj = it.next();
  14.                         if(obj.equals("java02")){
  15.                                 it.add("java08");
  16.                         }
  17.                 }
  18.                 sop(al);
  19.                 sop(it.hasPrevious());
  20.                 while(it.hasPrevious()){//反向遍历列表
  21.                         Object obj = it.previous();
  22.                         if(obj.equals("java02")){
  23.                                 it.add("java08");
  24.                         }
  25.                         
  26.                 }
  27.                 sop(al);
  28. /*               
  29.                 //在迭代过程中,准备添加或者删除元素
  30.                
  31.                 Iterator it = al.iterator();
  32.                 sop(al);
  33.                 while(it.hasNext()){
  34.                         Object obj = it.next();
  35.                         if(obj.equals("java02")){//不能同时用迭代器和集合操作方法操作集合。
  36. //                                al.add("java03");        //并发访问异常。ConcurrentModificationException
  37.                                 it.remove();
  38.                                 
  39.                         }
  40.                         sop(obj);        
  41.                 }
  42.                 sop("al:"+al);
  43. */               
  44.                
  45.         }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2