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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 付鑫鑫 于 2013-5-13 17:39 编辑

增强for循环,为何不能通过遍历所有的元素,再判断删除集合中指定的元素呢?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 新人加油!

查看全部评分

12 个回复

倒序浏览
因为增强for循环其实是通过集合的迭代实现的,在对集合迭代的过程中,如果产生并发修改,就是如果有增删这些改变集合长度的操作,那么集合的长度发生改变,而迭代器获取的长度是一开始的集合长度,改变后迭代器无法获知这些操作,所以不能这样做,当然,迭代器中提供了自己的remove方法,这个是可以在迭代的过程中对集合做增删操作的.希望能帮到您

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 他若追问请继续回答,可以再详细点的.

查看全部评分

回复 使用道具 举报
这个很详细。http://haohaoxuexi.iteye.com/blog/1523785
回复 使用道具 举报
补充下二楼的;如果是迭代器遍历集合,
对于List集合,有一个listIterator方法,使用这个迭代器可以完成边遍历边增删改查,希望能帮到你。。。。
回复 使用道具 举报
嗯,是应该加油了,要不然过几天又要涨价了,
回复 使用道具 举报
嗯,是应该加油了,要不然过几天又要涨价了,
回复 使用道具 举报
wangyougu010 发表于 2013-4-24 10:25
因为增强for循环其实是通过集合的迭代实现的,在对集合迭代的过程中,如果产生并发修改,就是如果有增删这些改 ...

增强for循环,是用迭代器来操作的么?  但,增强for循环,又没有得到迭代器
回复 使用道具 举报
wangyougu010 发表于 2013-4-24 10:25
因为增强for循环其实是通过集合的迭代实现的,在对集合迭代的过程中,如果产生并发修改,就是如果有增删这些改 ...

嗯,是应该加油了,要不然过几天又要涨价了,
回复 使用道具 举报
嗯,是应该加油了,要不然过几天又要涨价了,
回复 使用道具 举报
怎么回复了这么多,这是怎么了我
回复 使用道具 举报
付鑫鑫 发表于 2013-4-24 18:40
增强for循环,是用迭代器来操作的么?  但,增强for循环,又没有得到迭代器

jdk1.5以后的版本中,增强for循环, 如果是Collection, 调用的正是iterator()方法,即迭代器。你可以看下源码或者API里有没有。
回复 使用道具 举报
付鑫鑫 发表于 2013-4-24 18:40
增强for循环,是用迭代器来操作的么?  但,增强for循环,又没有得到迭代器

示例代码:
List<String> l = new ArrayList<String>();  
        l.add("abc");  
        for(String str:l){  
            System.out.println(str);  
        }
生成的class文件代码:
new java.util.ArrayList [16]  
    3  dup  
    4  invokespecial java.util.ArrayList() [18]  
    7  astore_1 [l]  
    8  aload_1 [l]  
    9  ldc <String "abc"> [19]  
   11  invokeinterface java.util.List.add(java.lang.Object) : boolean [21] [nargs: 2]  
   16  pop  
   17  aload_1 [l]  
   18  invokeinterface java.util.List.iterator() : java.util.Iterator [27] [nargs: 1]  
   23  astore_3  
   24  goto 44  
   27  aload_3  
   28  invokeinterface java.util.Iterator.next() : java.lang.Object [31] [nargs: 1]  
   33  checkcast java.lang.String [37]  
   36  astore_2 [str]  
   37  getstatic java.lang.System.out : java.io.PrintStream [39]  
   40  aload_2 [str]  
   41  invokevirtual java.io.PrintStream.println(java.lang.String) : void [45]  
   44  aload_3  
   45  invokeinterface java.util.Iterator.hasNext() : boolean [51] [nargs: 1]  
   50  ifne 27  
   53  return  

通过查看编译后的class文件可以看得到。增强for循环在编译后,自动转换为使用Iterator迭代。所以二者除了写法上没有任何区别。

回复 使用道具 举报
我原来也不懂,现在我明白了?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马