for循环分为两种:
第一种为普通的for循环
这种for循环通常需要三个步骤即 for(初始表达式;条件表达式;递增表达式)有时候递增表达式也可以省去,一般是在使用Iterator迭代时(Iterator的hasNext方法判断时,可以省去递增表达式)。这种for循环很常用。
第二种为增强的for循环(也就是foreach循环)
这种for循环的内部是调用了Iterator实现的(实现了Iterator接口),和Iterator遍历效果是一样(你可以断点调试跟踪代码看看内部原理),主要用于遍历数组、集合的每一个元素。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标,还有一点,在多线程下使用增强for来改变元素会出错误,因为通过迭代器实现的增强for对该数组或集合会现有一个拷贝,改变元素是会导致不能正常遍历数组和集合。所以说多线程下增强for是不安全不推荐用。
拿数组ArrayList和链表LinkedList来区分记忆:
1.ArrayList由于使用数组实现,因此下标明确,最好使用普通for循环。
2.而对于 LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强for循环,也就是iterator。
看代码吧,让这个问题更明朗些。
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ForTest {
public static void main(String[] args) {
//List<Integer> list = new ArrayList<Integer>();
List<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < 60000; i++) {
list.add(5);
}
int resutl = 0;
long start = System.currentTimeMillis();
//使用普通for循环
for (int i = 0; i < list.size(); i++) {
resutl = list.get(i);
}
System.out.println("普通循环使用了:" + (System.currentTimeMillis() - start)
+ "毫秒");
start = System.currentTimeMillis();
//使用增强for循环,这里什么也不做
for (int c2 : list) {
}
System.out.println("增强for循环使用了:" + (System.currentTimeMillis() - start)
+ "毫秒");
}
}
上面的输出结果为:

