A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 七宝 中级黑马   /  2013-8-15 21:49  /  1983 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 七宝 于 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());
  
}
迭代时怎么就出现异常了,感觉写得合情合理又合法啊

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

4 个回复

倒序浏览
在while里面写,会不停的add,陷入死循环,我觉得是这样
回复 使用道具 举报
我的理解是这样的
  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1

查看全部评分

回复 使用道具 举报
这是并发操作异常
回复 使用道具 举报
本帖最后由 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.         }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 很给力!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马