普通For循环和增强For循环

目录

定义

代码演示

总结


定义

普通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.遍历集合、容器简单

猜你喜欢

转载自blog.csdn.net/m0_59619191/article/details/120556199