讨论一下:Java的for循环是怎样执行的? 本帖最后由 FreeDove 于 2011-07-14 21:10:54 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 for(Long l : list)这样的循环里不能更改list也就是不能调用list.remove之类的方法 就比如C++里使用iterator,你修改原有的数据结构(删除个元素什么的),这个iterator就不能用了一样的道理 最好在list没有变化的情况下操作,如遍历的操作,list有更新时就无法判断是哪个list了 for(Long l : list) 得到的只是一个对象 跟list没关系 哦,意思相当于是虚拟机里做了处理了,类似list.add之类的对list进行更改的都不行咯 “list有更新时就无法判断是哪个list了”这话什么意思,可否详细些。java里对list的操作都是通过引址的方式吧,不管怎么更新,都不会生成新的list,都是那个list,怎么无法判断呢? 每轮循环这个对象都是从list里出来的,每轮都检查list的size,怎么跟list没关系。再说这个和楼主那里的报错没关系吧? for(Long l : list) {等同于Long l;for(Iterator iterator = list.iterator(); iterator.hasNext();) l = (Long)iterator.next();这里出现异常是因为一旦直接调用list.add/remove修改了list,iterator就不能用了删除你应该调用iterator.remove()方法! List<Long> list = new ArrayList<Long>(); list.add(new Long(1)); list.add(new Long(2)); list.add(new Long(3)); list.add(new Long(4)); list.add(new Long(5)); Iterator it = list.iterator(); while(it.hasNext()) { System.out.println("run."+it.next()); it.remove(); }你for 的时候 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象.Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。你可以使用 Iterator 本身的方法 remove() 来删除对象 呵呵,谢谢,这个回答最全面了还不想在循环里做数据结构的更改,不好控制,问这个只是好奇for(Long l : list)是怎么跑的而已。留着以后肯定用得上 API里面写得非常清楚。for( : )形式的循环实际上是创建了一个迭代器,不能在循环内部调用List的remove方法。而只能调用迭代器的remove for(Long l : list) 这个只是编译器优化处理而已,就是我上面写的代码,完全等同于Long l;for(Iterator iterator = list.iterator(); iterator.hasNext();) { l = (Long)iterator.next();}你找个反编译工具就可以看到了 明白了,编译成class文件时候换回这写法了哈~~ package test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/* * from http://hi.csdn.net/HeiBoyYang */public class Sample { public static void main(String[] args) { List listone=new ArrayList(); listone.add("tom"); listone.add("two"); Iterator it=listone.iterator(); //方案一 while(it.hasNext()){ System.out.println(it.next()); } //方案二 for(int i=0;i<listone.size();i++){ System.out.println(listone.get(i)); } //方案三 for(Object a:listone){ System.out.println(a); } }} 问题追加 无符号char型,在java 中怎么定义 有谁知道如何在BAT文件中运行JAVA的class文件 怀疑jpcap存在内存泄漏的问题. 怎么将字节数组转换成十六进制字符串 急求怎样由byte[]构造Image对象用于绘图 有关同步的问题 不要笑我,请知道的人帮助,先谢了,在线等 con = ds.getConnection()取不到连接,抛SQLException 谁都用java了给个 qq? 我刚开始,请开我的问题?初级的,给分 为什么是Graphics画图只画出最后的结果 而画不出循环时的结果 substring的问题
这样的循环里不能更改list也就是不能调用list.remove之类的方法
java里对list的操作都是通过引址的方式吧,不管怎么更新,都不会生成新的list,都是那个list,怎么无法判断呢?
再说这个和楼主那里的报错没关系吧?
for(Iterator iterator = list.iterator(); iterator.hasNext();)
l = (Long)iterator.next();
这里出现异常是因为一旦直接调用list.add/remove修改了list,iterator就不能用了
删除你应该调用iterator.remove()方法!
List<Long> list = new ArrayList<Long>();
list.add(new Long(1));
list.add(new Long(2));
list.add(new Long(3));
list.add(new Long(4));
list.add(new Long(5));
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println("run."+it.next());
it.remove();
}
你for 的时候 Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象.
Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。
你可以使用 Iterator 本身的方法 remove() 来删除对象
还不想在循环里做数据结构的更改,不好控制,问这个只是好奇for(Long l : list)是怎么跑的而已。留着以后肯定用得上
Long l;
for(Iterator iterator = list.iterator(); iterator.hasNext();) {
l = (Long)iterator.next();
}你找个反编译工具就可以看到了
import java.util.Iterator;
import java.util.List;
/*
* from http://hi.csdn.net/HeiBoyYang
*/
public class Sample {
public static void main(String[] args) {
List listone=new ArrayList();
listone.add("tom");
listone.add("two");
Iterator it=listone.iterator();
//方案一
while(it.hasNext()){
System.out.println(it.next());
}
//方案二
for(int i=0;i<listone.size();i++){
System.out.println(listone.get(i));
}
//方案三
for(Object a:listone){
System.out.println(a);
}
}}