这是一个很好的问题,我很乐意看到一些深入的答案。但是,官方文档说:
这些缺点为设计师所知,他们明智地决定采用一种干净,简单的结构来覆盖绝大多数情况。
绝大多数情况是我的答案。
从侧面来看,就我个人而言,我认为
foreachJava循环对于标准迭代器循环而言只是一种不错的语法。因此,编译器为结构创建迭代器,并使用变量获取当前迭代的值。为了确保变量已被初始化,您需要在循环范围内声明它(我认为这可以防止变量在其他地方使用,例如在另一个线程中使用)。因此,您不能在循环后使用变量。但是,这只是我的看法,如果能更好地了解它,我将非常高兴。:)
编辑 这里是有关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`只是编译器将其转换为预定义结构的语法糖,正如文档所述。这并不能回答
为什么如此 。在讨论的背景下,我虽然很有趣,但也许值得一读。



