大家好,又见面了,我是你们的朋友全栈君。
目录
增强型for循环语法:for(ElementType element:arrayName){};
增强型for循环语法:for(ElementType element:arrayName){};
举个例子:(1)
int[] numArray = { 1, 2, 3, 4, 5, 6 };
for (int i : numArray) {
System.out.print(i);
}
//结果会是123456
测试方法
public static void testFor() {
int [] array = {1,2,3};
for(int i : array){
System.out.println(i);
}
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
for(Object obj : list){
System.out.println(obj);
}
Map<String, String> map = new HashMap<>();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
System.out.println(stringStringEntry.getKey() + stringStringEntry.getValue());
}
}
使用idea查询编译后的class文件
编译后的文件信息为
public static void testFor() {
int[] array = new int[]{1, 2, 3};
int[] arr$ = array;
int len$ = array.length;
for(int i$ = 0; i$ < len$; ++i$) {
int i = arr$[i$];
System.out.println(i);
}
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
Iterator i$ = list.iterator();
while(i$.hasNext()) {
Object obj = i$.next();
System.out.println(obj);
}
Map<String, String> map = new HashMap();
map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
Iterator i$ = map.entrySet().iterator();
while(i$.hasNext()) {
Entry<String, String> stringStringEntry = (Entry)i$.next();
System.out.println((String)stringStringEntry.getKey() + (String)stringStringEntry.getValue());
}
}
我们发现增强for循环遍历数组时使用的普通for循环,而遍历集合时使用的Iterator迭代器
增强型for循环删除的问题
测试Java代码
public static void testFor() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
for(Object obj : list){
System.out.println(obj);
list.remove(obj);
}
}
编译后的class文件信息
public static void testFor() {
List list = new ArrayList();
list.add(1);
list.add(2);
list.add(3);
Iterator i$ = list.iterator();
while(i$.hasNext()) {
Object obj = i$.next();
System.out.println(obj);
list.remove(obj);
}
}
执行后
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:859)
at java.util.ArrayList$Itr.next(ArrayList.java:831)
at com.test.controller.TestMain.testFor(TestMain.java:108)
at com.test.controller.TestMain.main(TestMain.java:23)
解释说明:
迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值=并没有变化,所以会报错。
相关源码:
java.util.ArrayList#fastRemove
java.util.ArrayList.Itr#remove
增强型for循环注意事项
- 在使用增强型for循环不支持遍历时删除元素
- 使用增强型for循环时,对遍历的集合需要做null判断,不然可能引发空指针异常。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149848.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...