Java中for each怎么用
小编给大家分享一下Java中for each怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
在Java中,遍历集合和数组一般有以下三种形式:
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + ",");
}
Iterator iter= list.iterator();
while (iter.hasNext()) {
System.out.print(iter.next() + ",");
}
for (Integer i : list) {
System.out.print(i + ",");
}
第一种是普通的for循环遍历,第二种是使用迭代器进行遍历,第三种我们一般称之为增强for循环也就是for each循环。
for each实现原理剖析
我们对以下代码进行反编译:
for(String str:list){
System.out.print(str+",");
}
反编译后的代码是这样的:
String str;
for(Iterator iterator = list.iterator(); iterator.hasNext(); System.out.print((new StringBuilder(String.valueOf(str))).append(",").toString())){
str = (String)iterator.next();
}
反编译后的代码虽然有点复杂,不过通过反编译,我们看到Java中的for each循环底层是通过迭代器模式来实现的。
坑,小心哦
由于for each循环通过迭代器实现,那么必然有迭代器的特性。在Java中使用迭代器遍历元素的时候,在对集合进行删除的时候一定要注意,使用不当有可能发生ConcurrentModificationException,如以下代码:
for(String str:list){
System.out.print(str+",");
list.remove(str);
}
会抛出ConcurrentModificationException异常。
Iterator被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,当索引指针往后移动的时候就找不到要迭代的对象,所以会抛出ConcurrentModificationException异常。
Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用 Iterator 本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
正确的在遍历的同时删除元素的姿势:
Iterator<String> Iter = list.iterator();
while (Iter.hasNext()) {
String str=Iter.next();
System.out.print(str+",");
//注意不是list而是Iter的remove。
Iter.remove();
}
这个细微的问题,可能在大部分情况下由于条件的限制不会出现,一旦条件满足,问题便暴露出来,这就是为什么明明运行良好的代码突然报错了。因此在使用for each循环时一定要注意这个坑。
以上是“Java中for each怎么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341