之前同事突然问我一个问题,说foreach中是否可以删除列表中的元素,我大致说了能不能删除,为什么;然后我们将讨论是否可以这样做;(1)遍历元素首先我们以一段代码为例:String[]array={"1","2","3"};for(Stringi:array){System.out.println(i);}ArrayListlist=newArrayList<>();list.add("111");list.add("222");列表.add("333");for(Stringi:list){System.out.println(i);}遍历后的结果如下:123111222333结果毫无疑问。看一下编译后的源码(idea自带,直接在target包中打开你的class源码文件):String[]array=newString[]{"1","2","3"};String[]var2=array;intvar3=array.length;for(intvar4=0;var4list=newArrayList();list.add("111");list.add("222");list.add("333");Iteratorvar7=list.iterator();while(var7.hasNext()){字符串i=(String)var7.next();System.out.println(i);}可以看出,原来for循环是用来遍历数组的,而Iterator迭代器是用来进行集合的。(2)删除元素ohk!接下来,让我们删除元素:使用for循环:ArrayListlist=newArrayList<>();list.add("111");list.add("222");list.add("333");log.info(list.toString());for(inti=0;ilist=newArrayList<>();list.add("111");list.add("222");list.add("333");log.info(list.toString());for(Stringi:list){list.remove("222");}log.info(list.toString());结果:11:50:48.333[main]INFOcom.xiaolinge.com.hello.HelloWord-[111,222,333]java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)在java.util.ArrayList$Itr.next(大批List.java:859)atcom.xiaolinge.com.hello.HelloWord.main(HelloWord.java:30)显然没有成功!原因:迭代器内部的每次遍历都会记录List内部的modcount作为期望值,然后在每次循环中将期望值与List的成员变量modCount进行比较,但是正常的list.remove调用的是List的remove,whichmodcount++,但是迭代器中记录的期望值=没有变化,所以会报错如果要删除一个元素,需要使用迭代器内部的remove方法:ArrayListlist=newArrayList<>();list.add("111");list.add("222");list.add("333");log.info(list.toString());Iteratorit=list.iterator();while(it.hasNext()){Stringnext=it.next();//如果在外面使用list的remove方法还是会报错if(next.equals("222")){it.remove();//这里使用了迭代器中的remove()方法,//当然,如果你使用list的remove方法删除纹理元素的话,这里的方法是成功的,例如:list.remove("222")}}log.info(list.toString());结果:12:06:14.042[main]INFOcom.xiaolinge。com.hello.HelloWord-[111,222,333]12:06:14.046[main]INFOcom.xiaolinge.com.hello.HelloWord-[111,333](3)修改元素使用原来的for:ArrayListlist=newArrayList<>();list.add("111");list.add("222");list.add("333");log.info(list.toString());for(inti=0;ilist=newArrayList<>();list.add("111");list.add("222");list.add("333");log.info(list.toString());for(Stringi:list){i="444";}log.info(list.toString());结果:12:34:47.207[main]INFOcom.xiaolinge.com。hello.HelloWord-[111,222,333]12:34:47.211[main]INFOcom.xiaolinge.com.hello.HelloWord-[111,222,333]看到了,不行了,哎哟喂,不行了正在修改元素,是否可以修改元素的属性?让我们来看看。(4)foreach修改元素属性(for不做测试)创建学生类:publicclassStudent{privateintage;publicintgetAge(){返回年龄;}publicvoidsetAge(intage){this.age=age;}publicStringgetName(){返回名称;}publicvoidsetName(Stringname){this.name=name;}私有字符串名称;公共学生(){};publicStudent(intage,Stringname){这个。年龄=年龄;this.name=名字;}}哦,让我们测试一下代码:Studentstudent=newStudent(1,"huge");学生student1=newStudent(1,"xiaoyao");ListstudentList=newArrayList();studentList.add(学生);studentList.add(student1);System.out.println(student.getName());System.out.println(student1.getName());for(Studentstu:studentList){stu.setName("jingtian");}System.out.println(student.getName());System.out.println(student1.getName());结果:hugexiaoyaojingtianjingtian484厉害了!不能修改object,但是可以修改对象的属性。总结for和foreach可以遍历数组/集合,但是for在更复杂的循环中效率更高。foreach不能删除/修改集合元素,而for可以修改元素中的属性,所以foreach和for可以修改属性元素的数量,所以for循环相比起来效率更高。为了灵活。版权声明:本文为CSDN博主“码农小林哥”的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处转载链接及本声明。