foreach和for循环的区别
在学File的时候写遍历文件夹时碰到了一个问题
代码如下
package com.cyc;
import java.io.File;
public class Test03 {
public static void main(String[] args) {
File file = new File("C:\Users\CYC\Desktop\aaa");
del(file);
}
public static void del(File file) {
if (file.isFile()) {
file.delete();
} else {
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f);
del(f);
}
}
file.delete();
}
}
其中我在想如果最后传入的是一个空目录程序该如何执行呢,假设传入的是空目录,那么根本不会进入foreach循环,如果加入了foreach循环那么程序将会无限循环下去,所以空目录是不会进入foreach循环的
开始验证
认为无论数组有没有数据,foreach和for都不会进入循环,下面开始测试
package com.cyc.test01;
import java.util.ArrayList;
import java.util.List;
public class Test01 {
public static void main(String[] args) {
List<Integer> list=new ArrayList();
System.out.println("----------------");
for (Integer li:list){
System.out.println("这里是foreach循环");
}
System.out.println("+++++++++++++++++");
for (int i=0;i<list.size();i++){
System.out.println("这里是for循环");
}
System.out.println("----------------");
}
}
控制台如下
说明集合中没有元素时压根不进入for循环中
那么这俩有什么区别呢?
1.写法不同(众所周知)
2.中断循环不同
for循环是可以中断循环(利用break语句或return语句)
forEach是没有
3.关于扩展js原生的Array类
使用for循环时,打印每个value值,并不会打印出来扩展js原生的Array类(譬如下图),但使用forEach循环,就可以打印出来。
4.关于循环中包含有异步语句
for循环中包含异步语句时,初次遍历,进入到最里面的异步函数时,打印k,for循环已经循环完了,所以这个时候你打印的任何东西都是数组的最后一项。但是利用forEach循环,打印出来的就是数组中的每一项,不管异不异步。
5.实现原理不同
for循环:通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素。在处理比较复杂的处理的时候较为方便。
foreach:从头到尾,对于集合中的对象遍历。适用于简单的遍历。foreach使用的时候,会锁定集合的对象,期间不能进行新增/修改
6.效率不同
for循环没有额外的函数调用栈和上下文,所以它的实现最为简单。forEach:对于forEach来说,它的函数签名中包含了参数和上下文,所以性能会低于 for 循环。
foreach相对于for循环,代码减少了,但是foreach依赖IEnumerable(迭代器,es5新增特征)。在运行的时候效率低于for循环。当然了,在处理不确定循环次数的循环,或者循环次数需要计算的情况下。使用foreach比较方便。而且foreach的代码经过编译系统的代码优化后,和for循环的循环类似。