黑马程序员技术交流社区
标题:
关于for循环的疑问
[打印本页]
作者:
顾传文
时间:
2013-3-9 12:33
标题:
关于for循环的疑问
本帖最后由 顾传文 于 2013-3-9 12:39 编辑
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for(String str:list){
if("bbb".equals(str)){//为什么这里将bbb换成aaa会报异常
list.remove(str);
}
}
System.out.println(list);
============
将上面的循环换成
for(int i=0;i<list.size();i++){
if("aaa".equals(list.get(i))){//为什么这里将aaa不会报异常
list.remove(i);
}
}
作者:
陈圳
时间:
2013-3-9 12:38
本帖最后由 陈圳 于 2013-3-9 12:42 编辑
"bbb"是一个String类对象,但是他是一个具体的对象,而高级for循环需要的是一个String引用变量.他能一一指向LIst中的各个元素.对象与引用变量的区别,要理解
作者:
夏晓彤
时间:
2013-3-9 15:28
本帖最后由 夏晓彤 于 2013-3-9 15:47 编辑
楼上说的很清楚了"bbb"是一个String类对象,高级for循环需要的是一个String引用变量.他能一一指向LIst中的各个元素,所有用高级for循环需要改下代码
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
String s="aaa";//s指向对象“aaa”
for(String str:list){
if(s==str){//==用于比较地址
list.remove(str);
}
}
System.out.println(list.size());
复制代码
作者:
邹学良
时间:
2013-3-9 15:29
本帖最后由 邹学良 于 2013-3-9 15:39 编辑
运行了下,不管是比较list开始索引位或者最后一个索引位的数据:是不是有索引越界的感觉?
都会抛出异常:java.util.ConcurrentModificationException
原因是在调用checkForComodification和next方法出错:
找了这个位置的源码看了下:结论是:
迭代集合每次remove后的size都会发生变化,如果迭代基数不根据remove后的size动态调整,则会发生索引越界异常或内容遍历不全等问题ckForComodification方法和next方法时执行有问题,在调用“AAA”时,它是作为集合第一个索引也是结束位索,在List集合中,它的修改操作(add/remove)都会对modCount这个字段+1,modCount可以看作一个版本号,每次集合中的元素被修改后,都会+1(即使溢出)。
之后修正了下代码:
public class Test2 {
public static void main(String[] args){
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
Iterator<String> it = list.iterator();
while(it.hasNext()){
if("aaa".equals(it.next()))
it.remove();
}
System.out.println(list);
}
}
复制代码
输出打印效果:
BBB,CCC
作者:
夏晓彤
时间:
2013-3-9 15:53
本帖最后由 夏晓彤 于 2013-3-9 15:55 编辑
楼上说的很清楚了"bbb"是一个String类对象,高级for循环需要的是一个String引用变量.他能一一指向LIst中的 ...
哎刚才怎么刚才测试没问题,看样我还是错了,可能是忘记保存了,是List.remove(str)的问题,向楼上哥们学习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2