一、区别
1)for循环是基于下标(偏移量)来定位的循环。
2)foreach是基于指针直接移动(地址运算)的循环。
3)foreach与for循环的明显差别在于foreach循环时循环对象(数组、集合)被锁定,不能对循环对象中的内容进行增删改操作。
二、两者效率比较
对于通过下标访问的数据结构。例如数组,Arraylist 使用下标访问的for循环效率本身就很高。所以foreach这种指针直接移动的效率可能甚至不如通过下标访问。但差别不会太大
但对于链式结构LinkedList,for基于下标访问会每次从头查询,最好不要使用for。foreach循环使用指针直接偏移的高效的地址运算,效率会高非常多,差距也很大。链表循环超过10万次for循环可能会直接卡死,而foreach仍然只需要几毫秒。
例:普通for循环
package ch02;import java.util.Arrays;public class Test {public static void main(String[] args) {String[] str = {"a","b","c"};for (int i = 0; i < str.length; i++) {if(str[i]=="b") {str[i]="d";}}System.out.println(Arrays.toString(str));}}//运行结果:[a, d, c]
增强for循环:
package ch02;import java.util.Arrays;import java.util.Iterator;public class Test {public static void main(String[] args) {String[] strs = {"a","b","c"};for (String str : strs) {if(str=="b") {str="d";}}System.out.println(Arrays.toString(strs));}}//运行结果:[a, b, c]
结论:需要循环数组结构的数据时,建议使用普通for循环,因为for循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。
需要循环链表结构的数据时,一定不要使用普通for循环,数据量大的时候有可能会导致系统崩溃。