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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 顾传文 中级黑马   /  2013-3-9 12:33  /  1188 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 顾传文 于 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);
     }
    }

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
本帖最后由 陈圳 于 2013-3-9 12:42 编辑

"bbb"是一个String类对象,但是他是一个具体的对象,而高级for循环需要的是一个String引用变量.他能一一指向LIst中的各个元素.对象与引用变量的区别,要理解
回复 使用道具 举报
本帖最后由 夏晓彤 于 2013-3-9 15:47 编辑

楼上说的很清楚了"bbb"是一个String类对象,高级for循环需要的是一个String引用变量.他能一一指向LIst中的各个元素,所有用高级for循环需要改下代码
  1. ArrayList<String> list = new ArrayList<String>();
  2.                   list.add("aaa");
  3.                   list.add("bbb");
  4.                   list.add("ccc");
  5.                   String s="aaa";//s指向对象“aaa”
  6.                   for(String str:list){
  7.                    if(s==str){//==用于比较地址
  8.                    list.remove(str);
  9.                    }
  10.                   }
  11.                   System.out.println(list.size());
复制代码
回复 使用道具 举报
本帖最后由 邹学良 于 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(即使溢出)。
之后修正了下代码:
  1. public class Test2 {
  2.         public static void main(String[] args){
  3.                 List<String> list = new ArrayList<String>();
  4.                   list.add("aaa");
  5.                   list.add("bbb");
  6.                   list.add("ccc");
  7.                   Iterator<String> it = list.iterator();
  8.                     while(it.hasNext()){
  9.                      if("aaa".equals(it.next()))
  10.                       it.remove();
  11.                     }
  12.                   System.out.println(list);
  13.         }
  14. }
复制代码
输出打印效果:
BBB,CCC
回复 使用道具 举报
本帖最后由 夏晓彤 于 2013-3-9 15:55 编辑
楼上说的很清楚了"bbb"是一个String类对象,高级for循环需要的是一个String引用变量.他能一一指向LIst中的 ...

哎刚才怎么刚才测试没问题,看样我还是错了,可能是忘记保存了,是List.remove(str)的问题,向楼上哥们学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马