黑马程序员技术交流社区

标题: 一个关于list集合的疑问!!编译器问题? [打印本页]

作者: Mr.Z.Lee    时间: 2013-11-8 20:53
标题: 一个关于list集合的疑问!!编译器问题?
  1. package com.socket.all;

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

  5. public class myList extends ArrayList<Object> {

  6.         /**
  7.          * @param args
  8.          */
  9.         public static void main(String[] args) {
  10.                 // TODO Auto-generated method stub
  11.                 ArrayList list = new ArrayList();

  12.                 Scanner scanner = new Scanner(System.in);
  13.                 System.out.println("请选择输入元素个数:");
  14.                 int sumObject = scanner.nextInt();
  15.                 for (int i = 0; i < sumObject; i++) {
  16.                         list.add(scanner.nextInt());
  17.                 }
  18.                 Iterator it = list.iterator();
  19.                 while (it.hasNext()) {
  20.                         list.removeRange(2,3);//JDK api分明是有这个函数的,可是这里怎么报错了?编译器的问题吗?
  21.                         System.out.println(it.next());
  22.                 }
  23.         }

  24. }
复制代码

作者: ~﹏~    时间: 2013-11-8 20:57
myList list = new myList();
作者: 寻丶丶觅    时间: 2013-11-8 21:02
迭代过程中,不能用List集合的方法操作,因为这时候迭代器对其进行操作,相当于多线操作,有安全隐患,虚拟机报错
作者: 中山狼    时间: 2013-11-8 21:17
这个是ConcurrentModificationException ,当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。也就是说,在迭代器内部,不能对list集合进行改变;要想解决该错误,建议使用for循环,在循环内部进行改变for(int i=0;i<list.size();i++){
list.removeRange(2,3);
}
作者: 起猿    时间: 2013-11-9 01:19
楼主的问题出在迭代器的使用上,为了方便观看,我就复制了迭代的那段代码

  1. <P> </P>
复制代码

  1. <P>Iterator it = list.iterator();
  2. while (it.hasNext()) {
  3. list.removeRange(2,3);//api 中出现这个方法没错,但是在ArrayList中,而不是迭代器中。这里提示迭代器中找不到次方法。</P>
  4. <P>System.out.println(it.next());
  5. }</P>
复制代码
所以你只有通过for循环,get()和size()方法来进行遍历操作,然后选择你的删除集合内元素的操作。
这里说一下并发修改异常。
是先创建了迭代器,这个时候。迭代器内已经加载好集合中的元素了。迭代器是以来集合存在的,在迭代的过程中,如果通过调用方法来修改元素,就相当于改变了迭代器,而迭代器是在循环外得到的,所以在循环中迭代器是不知道集合发生改变。所以会产生并发修改异常。如果要改其中的元素,要么用for循环来遍历集合,然后进行修改。要么用迭代器对象来修改。迭代器使用ListIterator。可以实现迭代过程中的增删改查等动作






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