黑马程序员技术交流社区
标题:
一个关于list集合的疑问!!编译器问题?
[打印本页]
作者:
Mr.Z.Lee
时间:
2013-11-8 20:53
标题:
一个关于list集合的疑问!!编译器问题?
package com.socket.all;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;
public class myList extends ArrayList<Object> {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList list = new ArrayList();
Scanner scanner = new Scanner(System.in);
System.out.println("请选择输入元素个数:");
int sumObject = scanner.nextInt();
for (int i = 0; i < sumObject; i++) {
list.add(scanner.nextInt());
}
Iterator it = list.iterator();
while (it.hasNext()) {
list.removeRange(2,3);//JDK api分明是有这个函数的,可是这里怎么报错了?编译器的问题吗?
System.out.println(it.next());
}
}
}
复制代码
作者:
~﹏~
时间:
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
楼主的问题出在迭代器的使用上,为了方便观看,我就复制了迭代的那段代码
<P> </P>
复制代码
<P>Iterator it = list.iterator();
while (it.hasNext()) {
list.removeRange(2,3);//api 中出现这个方法没错,但是在ArrayList中,而不是迭代器中。这里提示迭代器中找不到次方法。</P>
<P>System.out.println(it.next());
}</P>
复制代码
所以你只有通过for循环,get()和size()方法来进行遍历操作,然后选择你的删除集合内元素的操作。
这里说一下并发修改异常。
是先创建了迭代器,这个时候。迭代器内已经加载好集合中的元素了。迭代器是以来集合存在的,在迭代的过程中,如果通过调用方法来修改元素,就相当于改变了迭代器,而迭代器是在循环外得到的,所以在循环中迭代器是不知道集合发生改变。所以会产生并发修改异常。如果要改其中的元素,要么用for循环来遍历集合,然后进行修改。要么用迭代器对象来修改。迭代器使用ListIterator。可以实现迭代过程中的增删改查等动作
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2