java foreach实现原理

  1. 引言
    我们知道foreach语句是可以遍历数组和集合对象,而且foreach语句是for语句特殊情况下得简化版,任何能使用foreach的情况下都能改写成for语句的形式,但是,foreach的底层实现是什么样子的?下面一一详细说明。

  2. ​foreach遍历集合
    foreach可以遍历LIst,Set等继承Collection的对象,一下是简单的例子。

    public class Example {
       public static void main(String[] args) {
           List<Integer> list = new ArrayList<>(); //[1,2,3,4,5]
           Set<Integer> set = new HashSet<>(); //[1,2,3,4,5]
    
           for (Integer i : list){
               System.out.println(i);
           }
    
           for (Integer i : set){
               System.out.println(i);
           }
       }
    }

    这里有一个List和Set,假设里面都存储5个对象[1,2,3,4,5]。foreach可以遍历其中的元素并依次输出。以下是编译后的内容

    public static void main(String[] args) {
           ArrayList list = new ArrayList();
           HashSet set = new HashSet();
    
           Iterator var10 = list.iterator();
    
           Integer var11;
           while(var10.hasNext()) {
               var11 = (Integer)var10.next();
               System.out.println(var11);
           }
    
           var10 = set.iterator();
    
           while(var10.hasNext()) {
               var11 = (Integer)var10.next();
               System.out.println(var11);
           }
       }

    这里可以清楚的看到,编译器会先获得集合的iterator对象的实例, 然后根据泛型声明一个指定对象类型的对象,然后进行while循环,使用iterator的hasNext方法和next方法进行取值。

    这就是foreach遍历集合对象的底层实现

  3. foreach遍历数组对象
    我们知道,数组是没有实现Iterable接口的,所以foreach遍历数组对象时底层会怎么处理呢?我们看下面的例子

    public class Example {
       public static void main(String[] args) {
           int[] array = new int[]{1,2,3,4,5,6,7};
    
           for (Integer i : array){
               System.out.println(i);
           }
       }
    }

    这里初始化数组时放入了数字1-7,然后循环遍历打印,编译后的内容如下

    public static void main(String[] args) {
           int[] array = new int[]{1, 2, 3, 4, 5, 6, 7};
           int[] var2 = array;
           int var3 = array.length;
    
           for(int var4 = 0; var4 < var3; ++var4) {
               Integer i = Integer.valueOf(var2[var4]);
               System.out.println(i);
           }
       }

    很容易的看出来,数组的遍历是通过基本的for()循环来实现的,具体内容不再赘述

  4. 总结
    两个简单的例子说明了foreach遍历集合类型和数组类型底层实现的不同

    • 集合类型的遍历本质是使用迭代器实现的
    • 数组的遍历是通过for循环来实现的

    所以可以扩展到Map类型的遍历,本质也是了集合遍历一致,通过迭代器来遍历所有的key或者value

如有不正确的地方,还希望大家及时指正

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值