黑马程序员技术交流社区

标题: 迭代器并发修改异常问题!!! [打印本页]

作者: 聂益飞    时间: 2013-3-27 16:00
标题: 迭代器并发修改异常问题!!!
  1. import java.util.List;
  2. import java.util.ListIterator;

  3. public class Demo {
  4.         public static void main(String[] args) {
  5.                
  6.                 List list= new ArrayList();
  7.                
  8.                 list.add("天天");
  9.                 list.add("怪物");
  10.               list.add("12345");
  11.                
  12.                 ListIterator it =list.listIterator();
  13.                
  14. /*并发修改异常发生的原因是在迭代中集合添加了元素,但没通知迭代器
  15. * 在处理并发修改异常时候,不想用原来的2种方式.而是在迭代中从新迭代
  16. * 但是却抛出了超出错误:OutOfMemoryError
  17. *  这个是怎么超出内存的啊?如何解决?是否不能在迭代中从新迭代啊?
  18. */
  19.                 while(it.hasNext())
  20.                 {
  21.                         String s=(String)it.next();
  22.                         if("天天".equals(s))
  23.                         {
  24.                                 list.add("8888888");
  25.                                
  26.                                 /*
  27.                                  * 在迭代中从新迭代
  28.                                  */
  29.                                 it =list.listIterator();
  30.                                  
  31.                         }
  32.        
  33.                 }
  34.                 System.out.println(list);
  35.         }
  36. }
复制代码

作者: itserious    时间: 2013-3-27 16:28
你那都变成死循环了。
每当遍历到 “天天”的时候,你就会向集合中添加一个新的元素。list.add("8888888");
然后你又创建一个新的迭代器,又从集合用第一个元素,开始遍历。当遍历到 “天天”的时候,
你又会向集合中添加一个新的元素。list.add("8888888");然后你又创建一个新的迭代器,
又从集合用第一个元素,开始遍历。
这样一直循环下去,集合中的元素不断增加,虽然你的集合是可变长度的,但JVM给你的集合分配的可用空间是有限的。
你一直向集合中添加元素,当JVM给你的集合分配的最大空间用完了后,必然就会内存溢出了。
作者: kaka小明    时间: 2013-4-24 23:03
楼上正解 list.add("8888888")改成it.add("8888888")试下,去掉死循环的那句。




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