目录
定义
代码演示
总结
定义
普通for循环
步骤:初始表达式;条件表达式;递增表达式)
有时候递增表达式也可以省去,一般是在使用Iterator迭代时(Iterator的hasNext方法判断时,可以省去递增表达式)。这种for循环很常用。
增强的for循环:
这种for循环的内部是调用了Iterator实现的(实现了Iterator接口),和Iterator遍历效果是一样(你可以断点调试跟踪代码看看内部原理),主要用于遍历数组、集合的每一个元素。
优点:1.写法简便 2.无需获得数组、集合长度 3.无需索引来访问元素
缺点:1.不能在循环动态删除元素和获取元素下标 2.在多线程下使用增强for来改变元素会出错误,因为通过迭代器实现的增强for对该数组或集合会现有一个拷贝,改变元素是会导致不能正常遍历数组和集合。所以说多线程下增强for循环是不安全不推荐用。
区别:(1)对于非集合类(没有实现 Iterable接口的)的数组遍历,增强型for循环和普通循环遍历原理相同,效率基本相同
(2)对于集合类(实现了Iterable接口的),增强型for循环的遍历其本质就是迭代器 iterator的遍历,和普通循环遍历相比,各自有自己适用的场景,比如说普通for循环比较适合List类(数组类)遍历通过下标查找数据的,而增强型for循环则比较适合链表结构的集合的遍历。
代码演示
1.遍历集合类
public static void main(String[] args) {person[] listtest =new person[5000000];int [] a= new int[600000];for (int i = 0; i < 600000; i++) {a[i]=i;}int b=0;long ts=System.currentTimeMillis();for(int i=0;i<a.length;i++){b=a[i];}System.out.println("普通for的耗用时间 "+(System.currentTimeMillis()-ts));long ts1=System.currentTimeMillis();for(int i:a){b=i;}System.out.println("增强for的耗用时间 "+(System.currentTimeMillis()-ts1));for(int i=0;i<5000000;i++){listtest[i]= new person("狗蛋");}Object p=null;long start=System.currentTimeMillis();for(int i=0;i<listtest.length;i++){p=listtest[i];}System.out.println("普通for的耗用时间 "+(System.currentTimeMillis()-start));long start1=System.currentTimeMillis();for(Object o:listtest){p=o;}System.out.println("增强for的耗用时间 "+(System.currentTimeMillis()-start1));}}class person{String name;public person(String name) {super();this.name = name;}}
输出结果:
普通for的耗用时间 10
增强for的耗用时间 11
普通for的耗用时间 5
增强for的耗用时间 4
2.遍历非集合类
List<String> list = new ArrayList<String>();for (int i = 0; i < 500000; i++) {list.add("翠芬");}long start2 = System.currentTimeMillis();String str = null;for (int i = 0; i < list.size(); i++) {str = list.get(i);}System.out.println("普通for循环+get方法: "+ (System.currentTimeMillis() - start2));long start3 = System.currentTimeMillis();for (String str1 : list) {str=str1;}System.out.println("增强for循环+赋值:"+ (System.currentTimeMillis() - start3));List<String> list1 = new LinkedList<String>();for (int i = 0; i < 50000; i++) {list1.add("菜花");}long start4 = System.currentTimeMillis();String str1 = null;for (int i = 0; i < list1.size(); i++) {str1=list1.get(i);}System.out.println("普通for循环+get方法: "+ (System.currentTimeMillis() - start4));long start5 = System.currentTimeMillis();for (String str2 : list1) {str1=str2;}System.out.println("增强for循环+赋值:"+ (System.currentTimeMillis() - start5));
输出结果:
普通for循环+get方法: 8
增强for循环+赋值:8
普通for循环+get方法: 893
增强for循环+赋值:2
总结
相对于for(;;)而言 增强for循环有两个好处:
1.写起来简单
2.遍历集合、容器简单