Java For Loop差异

这些语句在Java的内存占用和效率方面完全相同吗?

第一

Object[] array = new Object[100]; int i = 0; for (; i < array.length; i++){ Object o = array[i]; //do something } 

第二

 Object[] array = new Object[100]; for (int i = 0; i < array.length; i++){ Object o = array[i]; //do something } 

第三

 Object[] array = new Object[100]; for (Object o : array){ //do something } 

在内存占用和效率方面,是的。 但是,存在差异。 在第一个中, i存在(有一个范围)超出循环; 而在第二个它没有。 在第三种情况下,没有(直接)方式来访问索引或更改当前对象位置处的数组内容。

第一个不是常见的习语; 我不会那样写。

没有记忆或效率差异。 第三个是在后来的JVM中添加的语法糖(我相信它是JDK 6)。

您的代码将是内存和效率瓶颈,而不是您的循环结构。

第三个版本是随Java 5引入的,旨在简化您使用generics的工作。 它是增强的,因为您不需要在循环之前确定数组中有多少元素。 也无需指定如何增加当前位置,无需创建计数器变量或迭代器即可提供更清晰的实现。

不,它不完全一样。 这很容易validation,甚至不令人惊讶。

只需反编译以下两个function:

 public static void test1(Object[] arr) { for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } public void test2(Object[] arr) { for(Object o : arr) { System.out.println(o); } } 

并查看输出:

 public static void test1(java.lang.Object[]); Code: 0: iconst_0 1: istore_1 2: iload_1 3: aload_0 4: arraylength 5: if_icmpge 23 8: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream; 11: aload_0 12: iload_1 13: aaload 14: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 17: iinc 1, 1 20: goto 2 23: return public void test2(java.lang.Object[]); Code: 0: aload_1 1: astore_2 2: aload_2 3: arraylength 4: istore_3 5: iconst_0 6: istore 4 8: iload 4 10: iload_3 11: if_icmpge 34 14: aload_2 15: iload 4 17: aaload 18: astore 5 20: getstatic #4; //Field java/lang/System.out:Ljava/io/PrintStream; 23: aload 5 25: invokevirtual #5; //Method java/io/PrintStream.println:(Ljava/lang/Object;)V 28: iinc 4, 1 31: goto 8 34: return } 

我只是包含了println(),这样我们就可以看到变量已完成,并确保javac不会对其进行优化。 显然,从更大的角度来看,差异并不重要,它们几乎不可测量,但仍然不是相同的代码;)

虽然我不确定第二个function到底发生了什么,所以如果有人想花时间解剖代码继续下去;-)