java foreach 实现原理

 2023-09-11 阅读 22 评论 0

摘要:一个老问题 , 增强for循环的实现方式是什么 public static void main(String[] args) {List<String> list = new ArrayList<>();//对集合 , 本质上是iterator迭代器list.add("A");list.add("B");list.add("C");for (String s : list)

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

    public static void main(String[] args) {List<String> 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<String> 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);}

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

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

/*** Implementing this interface allows an object to be the target of* the "for-each loop" statement. See* <strong>* <a href="{@docRoot}/../technotes/guides/language/foreach.html">For-each Loop</a>* </strong>** @param <T> the type of elements returned by the iterator** @since 1.5* @jls 14.14.2 The enhanced for statement*/
public interface Iterable<T> {
// 其他代码略...
}

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

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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/48256.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息