for循环与增强for循环

@for循环与增强for循环

for与增强for循环的对比

for循环分为两种:
第一种为普通的for循环
这种for循环通常需要三个步骤即 for(初始表达式;条件表达式;递增表达式)有时候递增表达式也可以省去,一般是在使用Iterator迭代时(Iterator的hasNext方法判断时,可以省去递增表达式)。这种for循环很常用。
第二种为增强的for循环(也就是foreach循环)
这种for循环的内部是调用了Iterator实现的(实现了Iterator接口),和Iterator遍历效果是一样(你可以断点调试跟踪代码看看内部原理),主要用于遍历数组、集合的每一个元素。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标,还有一点,在多线程下使用增强for来改变元素会出错误,因为通过迭代器实现的增强for对该数组或集合会现有一个拷贝,改变元素是会导致不能正常遍历数组和集合。所以说多线程下增强for循环是不安全不推荐用。

区别

(1)对于非集合类(没有实现 Iterable接口的)的数组遍历,增强型for循环和普通循环遍历原理相同,效率基本相同
(2)对于集合类(实现了Iterable接口的),增强型for循环的遍历其本质就是迭代器 iterator的遍历,和普通循环遍历相比,各自有自己适用的场景,比如说普通for循环比较适合List类(数组类)遍历通过下标查找数据的,而增强型for循环则比较适合链表结构的集合的遍历。

遍历非集合类
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

遍历集合类

    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

  • 5
    点赞
  • 0
    评论
  • 14
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值