foreach循环也叫增强型的for循环,或者叫foreach循环。
foreach循环是JDK5.0的新特性(其他新特性比如泛型、自动装箱等)。
import java.util.Arrays; public class Main { public static void main(String[] args) { int arr[] = new int[4]; for (int x : arr) { System.out.println(x); } for (int i = 3; i > 0; i--) { arr[i] = i; } System.out.println(Arrays.toString(arr)); } }
0
0
0
0
[0, 1, 2, 3]
对它进行修改:
import java.util.Arrays; public class Main { public static void main(String[] args) { int arr[] = new int[4]; for(int num:arr){ num=3; } System.out.println(Arrays.toString(arr)); } }
[0, 0, 0, 0]
发现修改对其无效,但是也不报错。
add:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] strArray={"111","222","333","444"}; List<String> list=new ArrayList<String>(Arrays.asList(strArray)); System.out.println(list); for(String str:list){ System.out.println(str); list.add("sss"); System.out.println("添加后:"+list); } } }
Exception in thread "main" java.util.ConcurrentModificationException [111, 222, 333, 444] at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 111 at java.util.ArrayList$Itr.next(ArrayList.java:851) 添加后:[111, 222, 333, 444, sss] at com.qhong.Main.main(Main.java:13) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
remove:
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { String[] strArray={"111","222","333","444"}; List<String> list=new ArrayList<String>(Arrays.asList(strArray)); System.out.println(list); for(String str:list){ System.out.println(str); list.remove(str); System.out.println("移除后:"+list); } } }
[111, 222, 333, 444] Exception in thread "main" java.util.ConcurrentModificationException 111 at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901) 移除后:[222, 333, 444] at java.util.ArrayList$Itr.next(ArrayList.java:851) at com.qhong.Main.main(Main.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) Process finished with exit code 1
foreach这种循环一般只适合做数组的遍历,提取数据显示等,不适合用于添加删除和使用下标等复杂的操作。
foreach语句是for语句特殊情况下的增强版本,简化了编程,提高了代码的可读性和安全性(不用怕数组越界)。相对老的for语句来说是个很好的补充。
foreach循环的缺点:丢掉了索引信息。
当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息。