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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yangyinhui 中级黑马   /  2013-4-4 13:57  /  1905 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 yangyinhui 于 2013-4-4 17:34 编辑

在用增强for循环删除集合中的元素为什么会抛异常

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

6 个回复

倒序浏览
因为增强for循环不能在遍历集合的时候动态的对集合进行增删改查操作。

i增强for循环本身是内部调用了iterator。   iterator不能对集合进行增改查操作,

虽然有一个删除用的(可选)remove方法,但是remove的使用也是有前提的,

remove删除的是最后一个next方法所返回的对象,所以调用remove方法之前必须先调用next();

总之,增强for循环只能获取元素,不能动态操作集合,也不能获取下标。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
接口Iterator定义了增强for循环,增强for循环只能获取集合元素,不能改变集合结构就是不能增删集合元素。
回复 使用道具 举报
因为增强的for循环内部就是调用iterator实现的,在遍历的时候就将list转化为了迭代器,当迭代器被创建之后,如果从结构上对列表修改除非通过迭代器自身的remove、add方法,其他任何时间任何方式的修改,迭代器都会抛出ConcurrentModificationException异常。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
for只能对集合中的元素进行遍历不能进行增删的动作,使用iterator中可以的。
回复 使用道具 举报
因为在在增强for循环的循环体里,相当于是在桟空间中重新定义了一个引用型的变量,指向集合中元素对应的在堆内存中的实体变量,在这个增强for中的操作对循环体外面的集合本身是没有丝毫影响的,又容易造成理解代码时的困难,所以Java提供了一种机制,可以在编译期间就把这样的操作封杀。具体的方法,是在循环变量类型前面加上一个“final”修饰符。这样一来,在循环体里对循环变量进行赋值,就会导致一个编译错误。
回复 使用道具 举报
明白了。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马