之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因;接下来我们来探讨一下是否能够如此;
(1)遍历元素首先,我们一一段代码为例:
遍历后结果如下:
123111222333
结果毫无疑问。我们再来看看编译后的源码(idea自带,在target包里打开你的类源码文件即可):
可见,遍历数组使用的是原始for循环,集合的话使用的是Iterator迭代器。
(2)删除元素哦的k!接下来我们来删除元素:使用for循环:
结果:
11:11:52.532 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]11:11:52.539 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 333]
显然成功!使用foreach:
结果:
11:50:48.333 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]Exception in thread "main" java.util.ConcurrentModificationException at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909) at java.util.ArrayList$Itr.next(ArrayList.java:859) at com.xiaolinge.com.hello.HelloWord.main(HelloWord.java:30)
显然木有成功!
原因:
迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值=并没有变化,所以会报错。如果想要删除元素的话需要使用迭代器内部的remove方法:
结果:
12:06:14.042 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]12:06:14.046 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 333]
(3)修改元素使用原始for:
结果:
12:12:56.910 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]12:12:56.915 [main] INFO com.xiaolinge.com.hello.HelloWord - [444, 444, 444]
哦的k!可以修改元素;
使用foreach:
结果:
12:34:47.207 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]12:34:47.211 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
看到咯,不行的哦。辣么,修改元素不行,修改元素的属性可不可以呢?让我们来看下吧。
(4)foreach修改元素属性(for就不测试了)
创建一个学生类:
哦的k,接下来测试代码:
结果:
hugexiaoyaojingtianjingtian
484很神奇!修改不了对象,却可以修改对象的属性。
总结1、for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。2、foreach不可以删除/修改集合元素,而for可以3、foreach和for都可以修改元素里面的属性所以相比较下来for循环更为灵活。
到此这篇关于Java中for与foreach的区别的文章就介绍到这了,更多相关Java for与foreach内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!