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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄锋 黑马帝   /  2011-9-19 21:57  /  2269 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
for(String s : list){
if(s=="b"){
list.remove(s);
}
}
运行这段代码时候抛出了异常,难道增强for循环,只能支持对集合或者数组遍历吗?

4 个回复

正序浏览
黑马网友  发表于 2011-9-19 23:00:59
板凳

EnhancedFor

验证了下 这段代码没有异常[code]import java.util.*;
public classTestFor {
        public static void main(String[] args) {
                List<String> list=new ArrayList<String>();
                list.add("a");
                list.add("b");
                list.add("c");
                for(String s : list){
                        if(s=="b"){
                                list.remove(s);
                        }
                        System.out.println(s);
                }
        }

}[/code]增强的For循环支持数组和集合类,但是增强的For循环有几个缺陷:
1、在数组中不能方便的访问下标值。
2、在集合中与使用Iterator相比,不能方便的删除集合中的内容。

[b]用其他的方式遍历,可以考虑用容器本身的remove方法,但是因为增强For循环内部调用的也是Iterator,所以和Iterator一样,也是把容器锁定,所以只能调用Iterator的remove方法。[/b]

评分

参与人数 1技术分 +2 收起 理由
admin + 2

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-19 22:15:27
藤椅
增强for循环是1.5JDK的新特性,使用的也是跌代

为了确保迭代的顺利推进,必须符合的条件是被迭代的对象的结构不变

原因就是list在调用remove方法的时候list结构被改变了.

正确的做法如下:

Iterator<String> i=list.iterator();
  while(i.hasNext()){
   String s=i.next();
   if(s.equals("1")){
    i.remove();
   }else{
   System.out.println(s);
   }
  }

也就是创建一个迭代器,使用迭代器内置的remove方法
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马