源码 public void inForEach1() { for (String s : getStrings()) { } } public void outForEach1() { String[] strs = getStrings(); for (String s : strs) { } } public void simpleFor() { String[] strs = getStrings(); int l = strs.length; for (int i = 0; i < l; i++) { String s = strs[i]; } } public String[] getStrings() { return new String[0]; } 字节码 public void inForEach1(); Code: 0: aload_0 1: invokevirtual #51; //Method getStrings:()[Ljava/lang/String; 4: dup 5: astore 4 7: arraylength 8: istore_3 9: iconst_0 10: istore_2 11: goto 22 14: aload 4 16: iload_2 17: aaload 18: astore_1 19: iinc 2, 1 22: iload_2 23: iload_3 24: if_icmplt 14 27: return public void outForEach1(); Code: 0: aload_0 1: invokevirtual #51; //Method getStrings:()[Ljava/lang/String; 4: astore_1 5: aload_1 6: dup 7: astore 5 9: arraylength 10: istore 4 12: iconst_0 13: istore_3 14: goto 25 17: aload 5 19: iload_3 20: aaload 21: astore_2 22: iinc 3, 1 25: iload_3 26: iload 4 28: if_icmplt 17 31: return public void simpleFor(); Code: 0: aload_0 1: invokevirtual #51; //Method getStrings:()[Ljava/lang/String; 4: astore_1 5: aload_1 6: arraylength 7: istore_2 8: iconst_0 9: istore_3 10: goto 21 13: aload_1 14: iload_3 15: aaload 16: astore 4 18: iinc 3, 1 21: iload_3 22: iload_2 23: if_icmplt 13 26: return 通过上面简单的对比可以看出三种使用方式之间的效率的差异: 即使用传统for循环效率略高。而使用foreach,且将foreach中后面一个操作数的获取在foreach语句外进行的效率最低。