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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 聂益飞 高级黑马   /  2013-3-27 16:00  /  1850 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

点评

如果问题未解决,请继续追问回复者,如果问题已经解决,请将分类改为“已解决”,谢谢  发表于 2013-3-27 19:44

4 个回复

倒序浏览
你那都变成死循环了。
每当遍历到 “天天”的时候,你就会向集合中添加一个新的元素。list.add("8888888");
然后你又创建一个新的迭代器,又从集合用第一个元素,开始遍历。当遍历到 “天天”的时候,
你又会向集合中添加一个新的元素。list.add("8888888");然后你又创建一个新的迭代器,
又从集合用第一个元素,开始遍历。
这样一直循环下去,集合中的元素不断增加,虽然你的集合是可变长度的,但JVM给你的集合分配的可用空间是有限的。
你一直向集合中添加元素,当JVM给你的集合分配的最大空间用完了后,必然就会内存溢出了。
回复 使用道具 举报
楼上正解 list.add("8888888")改成it.add("8888888")试下,去掉死循环的那句。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马