我是靠谱客的博主 坚定音响,最近开发中收集的这篇文章主要介绍【Java基础系列】循环与迭代1. for循环2. 迭代,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1. for循环

  • 基本for循环

    for (int i = 0; i < 3; i++) {
    	System.out.println(i);
    }
    
  • 增强for循环
    增强for循环适用于对集合类和数组的循环。

    List<Integer> list = Arrays.asList(1, 2, 3);
    for (Integer v : list) {
        System.out.println(v);
    }
    

    对于集合类,本质上,它是基于Collection的迭代器(iterator)的简便写法。
    通过编译后的class文件可以看出还原后的代码:

    List<Integer> list = Arrays.asList(1, 2, 3);
    Iterator var3 = list.iterator();
    
    while(var3.hasNext()) {
       Integer v = (Integer)var3.next();
       System.out.println(v);
    }
    

    对于数组,编译后,依然是基本的for循环。

    //源代码
     int[] array = new int[]{1,2,3};
        for (int v : array){
            System.out.println(v);
    }
    //编译后
    int[] array = new int[]{1, 2, 3};
        int[] var3 = array;
        int var4 = array.length;
    
        for(int var5 = 0; var5 < var4; ++var5) {
            int v = var3[var5];
            System.out.println(v);
    }
    

2. 迭代

实现了Collection接口的所有集合类,都实现了迭代器(iterator),可以很方便的通过next()方法进行遍历:

List<Integer> list = Arrays.asList(1, 2, 3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()){
    System.out.println(iterator.next());
}

????思考:Java中遍历集合除了for,增强forIterator,还有forEach,那么这4种遍历方法的效率如何呢?

通过以下代码进行测试:

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        int max = 10000000;
        for (int i = 0; i < max; i++) {
            list.add(i);
        }
        long start = System.currentTimeMillis();
        testFor(list);
        long end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        testFor2(list);
        end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        testIterator(list);
        end = System.currentTimeMillis();
        System.out.println(end - start);

        start = System.currentTimeMillis();
        testForEach(list);
        end = System.currentTimeMillis();
        System.out.println(end - start);

    }

    private static void testFor(List<Integer> list) {
        int i = 0;
        for (int size = list.size(); i < size; i++) {

        }
    }

    private static void testFor2(List<Integer> list) {
        for (Integer integer : list) {

        }
    }

    private static void testIterator(List<Integer> list) {
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()) {
            iterator.next();
        }
    }

    private static void testForEach(List<Integer> list) {
        list.forEach(v -> {

        });
    }

测试结果:

数量for增强foriteratorforeach
100ms0ms0ms94ms
1000ms0ms0ms72ms
10001ms0ms0ms88ms
100001ms1ms1ms60ms
1000001ms5ms2ms127ms
10000001ms9ms6ms70ms
100000001ms31ms7ms80ms
1000000001ms232ms17ms280ms

执行效率从高到底依次是:for循环、iterator、增强for循环、foreach。

看一下编译后的class:

    private static void testFor(List<Integer> list) {
        int i = 0;

        for(int size = list.size(); i < size; ++i) {
        }

    }

    private static void testFor2(List<Integer> list) {
        Integer var2;
        for(Iterator var1 = list.iterator(); var1.hasNext(); var2 = (Integer)var1.next()) {
        }

    }

    private static void testIterator(List<Integer> list) {
        Iterator<Integer> iterator = list.iterator();

        while(iterator.hasNext()) {
            iterator.next();
        }

    }

    private static void testForEach(List<Integer> list) {
        list.forEach((v) -> {
        });
    }

其中增强for循环也是被替换成了迭代器。之所以iterator的效率要比增强for高一点,在编译后增强for多了赋值操作:var2 = (Integer)var1.next(),而测试种使用的iteratorwhile,少了赋值操作。

实际开发中,如果没有极致的性能要求,以上4种遍历方式都可以使用。

最后

以上就是坚定音响为你收集整理的【Java基础系列】循环与迭代1. for循环2. 迭代的全部内容,希望文章能够帮你解决【Java基础系列】循环与迭代1. for循环2. 迭代所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部