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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© RichardM 中级黑马   /  2015-7-24 21:58  /  518 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ListIterator listIterator():列表迭代器
*
* public interface ListIterator extends Iterator
*
* 面试题:ConcurrentModificationException:并发修改异常。
*                 这是个什么异常,怎么产生的,怎么解决的?

2 个回复

倒序浏览
ConcurrentModificationException:并发修改异
  这是个什么异常,怎么产生的,怎么解决的?

翻译是并发修改异常
产生的原因:当方法检测到对象的并发修改,但不允许这种修改时,
抛出此异常。
通常情况下,下面这种情况可能产生异常
在迭代器遍历元素的时候,list进行增删操作的时候
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");

//迭代器遍历元素,并且list修改元素
Iterator it = list.iterator();
while (it.hasNext()) {
String s =(String) it.next();
if ("world".equals(s)) {
list.add("javaee");
    }
}

产生的原因是:
迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
因此在迭代器遍历元素的时候,通过集合是不能修改元素的。

解决方法:
1:迭代器迭代元素,迭代器修改元素

ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String s = (String) lit.next();
if ("world".equals(s)) {
lit.add("javaee");
}
}

2:集合遍历元素,集合修改元素(普通for)

for (int x = 0; x < list.size(); x++) {
String s = (String) list.get(x);
if ("world".equals(s)) {
list.add("javaee");
}
}
回复 使用道具 举报
楼上写的蛮详细的。。。附上自己解决的代码:
  1. package com.hkddy8.test1;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.ListIterator;

  5. /*
  6. * 需求:请判断集合中是否有“list"这个元素,如果有,就添加一个元素叫:"zhouyou"
  7. */
  8. public class Test1 {
  9.         public static void main(String[] args) {
  10.                 // 创建一个集合
  11.                 ArrayList<String> al = new ArrayList<String>();
  12.                 al.add("abc");
  13.                 al.add("list");
  14.                 al.add("nihao");
  15.                 al.add("wagwu");
  16.                
  17.                 Iterator<String> it = al.iterator();
  18.                 boolean flag = false;
  19.                 while(it.hasNext()){
  20.                         String str = it.next();
  21.                         if(str.equals("list")){
  22.                                 flag = true; // 这里不能在集合中添加数据,因为会出现并发器异常!
  23.                         }
  24.                 }
  25.                 if(flag){
  26.                         al.add("zhouyou");
  27.                 }
  28.                 // 或者使用list特有的迭代器来做!!通过迭代器来添加数据!!
  29.                 ListIterator<String> list = al.listIterator();
  30.                 while(list.hasNext()){
  31.                         String str = list.next();
  32.                         if(str.equals("list")){
  33.                                 list.add("haha");// 通过迭代器而不是集合来添加数据
  34.                         }
  35.                        
  36.                 }
  37.                
  38.                 System.out.println(al);
  39.                
  40.         }
  41. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马