java foreach 实现原理

一个老问题 , 增强for循环的实现方式是什么

    public static void main(String[] args) {
        List list = new ArrayList<>();//对集合 , 本质上是iterator迭代器
        list.add("A");
        list.add("B");
        list.add("C");
        for (String s : list) {
            System.out.println(s);
        }

        int[] intArr = {1, 2, 3};
        for (int val : intArr) {//对数组 , 就是用fori的常规方式实现
            System.out.println(val);
        }
    }

为了验证这个结果 . 我们将生成的.class文件进行反编译 . 则可以看到

    public static void main(String[] args) {
        List list = new ArrayList();
        list.add("A");
        list.add("B");
        list.add("C");
        String s;
        for (Iterator localIterator = list.iterator(); localIterator.hasNext(); ) {
            s = (String) localIterator.next();
            System.out.println(s);
        }

        int[] intArr = {1, 2, 3};
        int val;
        for (int i = 0; i < intArr.length; i++) {
            val = intArr[i];
            System.out.println(val);
        }
    }

所以 , foreach在数组上还是使用了原来的fori循环 , 在其他对象上 , 实则是调用了itearator()方式使用迭代器的方式完成遍历 . 再来看如下代码 : 

    String str = "";
    for (String s : str) {
        System.out.println(s);
    }

当然 , 敲完如上代码后编译器肯定会冒红报错 , 我们先不管这些 . 直接运行

java foreach 实现原理_第1张图片

可以看到 , foreach要求的对象必须是数组或Iterable . 我们再看一下Iterable这个接口的源码

/**
 * Implementing this interface allows an object to be the target of
 * the "for-each loop" statement. See
 * 
 * For-each Loop
 * 
 *
 * @param  the type of elements returned by the iterator
 *
 * @since 1.5
 * @jls 14.14.2 The enhanced for statement
 */
public interface Iterable {
// 其他代码略...
}

这个接口里明确表明了 "实现该接口则允许对象成为'foreach'的目标" , 就是你实现这个接口之后 , 就可以使用foreach进行元素迭代 . 

  • 对于list/map , 调用iterator方法
  • 对于数组  , 转为fori原生方式

你可能感兴趣的:(Java,源码)