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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐志海 中级黑马   /  2014-1-4 16:23  /  1504 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐志海 于 2014-1-21 02:41 编辑
  1. <span style="line-height: 1.5;"><div class="blockcode"><blockquote>import java.util.*;

  2. public class ArrayListDemo
  3. {
  4.         
  5.         public static void sop(Object obj)
  6.         {
  7.                 System.out.println(obj);
  8.         }
  9.         public static void main(String[] args)
  10.         {
  11.                 ArrayList al=new ArrayList<String>();
  12.                 al.add("kk");
  13.                 al.add("kd");
  14.                 al.add("kc");
  15.                 al.add("ka");

  16.                
  17.                 ListIterator lit=al.listIterator();

  18.                
  19.                 while(lit.hasNext())
  20.                 {
  21.                         Object obj=lit.next();
  22.                         if(obj.equals("kc"))
  23.                          al.add("sx");
  24.                         
  25.                         
  26.                 }
  27.                         sop(al);
  28. }
  29. }
复制代码

为什么会发生ConcurrentModificationException异常

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

3 个回复

倒序浏览
代码贴完整
回复 使用道具 举报
修改后的代码为

  1. class ArrayListDemo
  2. {
  3.         public static void sop(Object obj)
  4.     {
  5.             System.out.println(obj);
  6.     }
  7.     public static void main(String[] args)
  8.     {
  9.         ArrayList<String> al=new ArrayList<String>();
  10.         al.add("kk");
  11.         al.add("kd");
  12.         al.add("kc");
  13.         al.add("ka");

  14.         ListIterator<String> lit=al.listIterator();
  15.         while(lit.hasNext())
  16.         {
  17.             Object obj=lit.next();
  18.             if(obj.equals("kk"))
  19.                     lit.remove();
  20.         }
  21.         sop(al);
  22.     }
  23. }
复制代码

他会报并发操作异常,因为你在迭代他的同时进行删除操作,这会影响迭代结果,所以编

译器不允许删除操作,java意识到Iterator迭代器的局限性,所以才搞了个ListIterator

的专门操作List集合的迭代器,他封装了remove()方法,内部处理了迭代结果,所以可以

使用ListIterator的remove方法。而集合自己的remove方法就没有内部处理迭代结果,所

以。。。。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
你的对象用错了!应该用li.add()方法。
  1. import java.util.ArrayList;
  2. import java.util.ListIterator;

  3. public class Test03 {
  4.         public static void main(String[] args){
  5.                 ArrayList<String> al = new ArrayList<String>();
  6.                 al.add("ab");
  7.                 al.add("cd");
  8.                 al.add("ef");
  9.                 System.out.println(al);
  10.                
  11.                 ListIterator<String> li = al.listIterator();
  12.                 while(li.hasNext()){
  13.                         Object obj = li.next();
  14.                         if(obj.equals("cd"))
  15.                                 li.add("hi");   //这里使用迭代器的方法;
  16.                 }
  17.                 System.out.println(al);
  18.         }      
  19. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

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