foreach是Java中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理,能够提高性能,并减少代码出错的几率。在Java中还有比如泛型,自动拆箱,自动装箱,内部类,枚举等等。
foreach是用来对数组或者集合进行遍历的语法。具体语法如下:
(元素类型避署:数组名/Iterable实例){ } >之前下面我们用foreach来对数组和一个集合进行遍历:
int[]数组={1,2,3}; (我:int数组){ System.out.println(我); } 名单列表=new ArrayList (); list.add (1); list.add (2); list.add (3); (对象obj:列表){ System.out.println (obj); } >之前然后我们可以通过反编译工具,查看类文件内容:
int[]数组={1,2,3}; int[]数组$=数组; (int len=数组$美元。长度,我$=0;我$ & lt; len美元;我+ + $) { int i=数组$美元[我]; { System.out.println(我); } } 名单列表=new ArrayList (); list.add (1); list.add (2); list.add (3); (java.util。迭代器我美元=list.iterator ();我.hasNext美元(); { 字符串s=(字符串)我$ . next (); { System.out.println(年代); } } >之前很明显:
1,对于数组,foreach循环实际上还是用的普通的,循环
2,对于集合,foreach循环实际上是用的迭代器迭代器迭代
如果我们想一边迭代,一边删除集合中的元素,如下:
名单列表=new ArrayList (); list.add (1); & lt; br>list.add (2); list.add (3); (对象obj:列表){ System.out.println (obj); list.remove (obj);//一边迭代一边删除 } >之前这样写会报如下错误:这是一个并发修改异常报错
原因:当迭代器运行的时候,在当前线程中,会单独的创建一个线程如负责继续迭代,B线程负责删除。B线程每次都会去检查一线程中的元素是否相同,如果不是就会报错
因为上面删除的方法是使用集合(ArrayList的父类)集合中的删除()方法。该方法只能从集合中删除元素,不能把迭代器中的元素也删除了。
解决办法:使用迭代器迭代器中的删除()方法
它=list.iterator Iterator (); 而(it.hasNext ()) { 对象obj=it.next (); System.out.println (obj); 如果(obj.equals (1)) { 拔除();//这里是用迭代器的删除()方法& lt; br>//list.remove (obj);//如果你用集合方法,那么还是会报的错 } } >之前以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
Java中详解的增强的循环foreach