栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么在Java的for-each循环中需要声明变量

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么在Java的for-each循环中需要声明变量

这是一个很好的问题,我很乐意看到一些深入的答案。但是,官方文档说:

这些缺点为设计师所知,他们明智地决定采用一种干净,简单的结构来覆盖绝大多数情况。

绝大多数情况是我的答案。

从侧面来看,就我个人而言,我认为

foreach
Java循环对于标准迭代器循环而言只是一种不错的语法。因此,编译器为结构创建迭代器,并使用变量获取当前迭代的值。为了确保变量已被初始化,您需要在循环范围内声明它(我认为这可以防止变量在其他地方使用,例如在另一个线程中使用)。因此,您不能在循环后使用变量。但是,这只是我的看法,如果能更好地了解它,我将非常高兴。:)

编辑 这里是有关Java循环的有趣文章

foreach

*我分析了 *另一个编辑 (使用jclasslib的这些方法的字节码:

 private static void testForEach(ArrayList<String> als) {  for(String s: als)    System.out.println(s); } private static void testIterator(ArrayList<String> als) {  for(Iterator<String> is = als.iterator(); is.hasNext();) {   String s = is.next();   System.out.println(s);  }  }

两种方法都由相同的字节码表示:

 0 aload_0 1 invokevirtual #2 <java/util/ArrayList.iterator> 4 astore_1 5 aload_1 6 invokeinterface #3 <java/util/Iterator.hasNext> count 111 ifeq 34 (+23)14 aload_115 invokeinterface #4 <java/util/Iterator.next> count 120 checkcast #5 <java/lang/String>23 astore_224 getstatic #6 <java/lang/System.out>27 aload_228 invokevirtual #7 <java/io/PrintStream.println>31 goto 5 (-26)34 return

区别在于第1行,后一种方法使用`invokevirtual

8
。但是,这两个调用都导致调用的相同方法
Iterator
。因此,似乎
foreach`只是编译器将其转换为预定义结构的语法糖,正如文档所述。这并不能回答

为什么如此 。在讨论的背景下,我虽然很有趣,但也许值得一读。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/569246.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号