Java的新特性enhanced for loop为什么好? int arr[5] = {2,4,8,16,32};for (int i=0; i<5; i++) System.out.println("Output: " + arr[i]);for(int a:arr) System.out.println("Output: "+ a);如上面的例子,Java的这个新特性都有什么具体的好处呢?请大家谈谈,多谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是JDK5带来的新东西其实就这样用就好了觉得爽、方便,就是好 ……是相对新……那么比起旧的for()有什么优点呢? LZ在用1.4的JDK 偶尔开始用1.5or1.6的时候才有了这个感慨吗 就是方便访问了,当不需要随机访问时不需要一个多余的临时变量,没别的。就跟 i = i + 1 写成 i+=1 和 i++ 一样的道理没达到设计模式上的深度 如果是遍历数组,从速度上来说,应该是arr[i]这种速度快如果是集合,速度应该是差不多的感觉纯粹属于个人喜好,没有啥新鲜的 Java一直在努力,降低程序员的简单体力劳动,让大家把精力放在更重要的地方去,而不是天天打这些简单的代码对于数组来说,for-each,编译后和直接用 for(int i=0;i<array.length;i++) 是一样的。编译器在编译时自动帮你处理好了.对于集合,则使用迭代器来实现 新特性比上面那一段性能要高很多。因为5这个常量对编译器来说它根本就是一个变通的常量,所以在编译时每个循环中要加入检查i是否已经越界的操作。每次循环至少多出三条指令。而如果是for(int a:arr) System.out.println("Output: "+ a);就一定会当作for(int i = 0;i<arr.length;i++) System.out.println("Output: "+ arr[i]);处理,编译器看到这段代码,知道所有的i都小于arr.length,那么arr[i]就不可能越界。所以不会增加检查越界的代码。 千万不要故意把arr.length计算出来放在for中。认为是优化,其实不懂编译器优化原理。 不知道兄台用的是哪个jdk,public void f1(){ String arr[] = new String[]{"aa","bb"}; for(String a : arr){ System.out.println(a); } } 生成的字节码:0: iconst_21: anewarray #2; //class java/lang/String4: dup5: iconst_06: ldc #3; //String aa8: aastore9: dup10: iconst_111: ldc #4; //String bb13: aastore14: astore_115: aload_116: astore_217: aload_218: arraylength19: istore_320: iconst_021: istore 423: iload 425: iload_3 26: if_icmpge 49 //貌似每次都比较了!!!!!!!29: aload_230: iload 432: aaload33: astore 535: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;38: aload 540: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V43: iinc 4, 146: goto 2349: return 那一段是循环控制,和检查数据越界有什么关系。int a[] = new int[200]; //大于10,否则会被内置常数指令优化for(int i=0;i<200;i++){ System.out,println(a[i]);}再编译看看 Thanks all for your answers! 如果有TXT能放手机上看的《JAVA核心技术》或《THINKING IN JAVA》就好了。。。 旧帖重发,解决许多人关心的Java应用程序播放音乐的问题,高手们过来看看吧 两进程通信,有一方面出了问题怎么解决? jdk环境配置问题? JSP中的include文件在tomcat 5.0 版本中出现乱码,请大虾指点。 怎样进行类型转换 我怎样才能把JAVA学好 wjmmml 拿分来,100分呀!!!! 如何在JB6的工程里加入别人编译好的一个类? 咨询一个netty channel的问题 0到底是奇数还是偶数? 问个关于args的问题
其实就这样用就好了
觉得爽、方便,就是好
那么比起旧的for()有什么优点呢?
就跟 i = i + 1 写成 i+=1 和 i++ 一样的道理
没达到设计模式上的深度
如果是集合,速度应该是差不多的感觉纯粹属于个人喜好,没有啥新鲜的
因为5这个常量对编译器来说它根本就是一个变通的常量,所以在编译时每个循环中要加入
检查i是否已经越界的操作。每次循环至少多出三条指令。
而如果是
for(int a:arr)
System.out.println("Output: "+ a);
就一定会当作
for(int i = 0;i<arr.length;i++)
System.out.println("Output: "+ arr[i]);
处理,编译器看到这段代码,知道所有的i都小于arr.length,那么arr[i]就不可能越界。
所以不会增加检查越界的代码。
不知道兄台用的是哪个jdk,
public void f1(){
String arr[] = new String[]{"aa","bb"};
for(String a : arr){
System.out.println(a);
}
}
生成的字节码:
0: iconst_2
1: anewarray #2; //class java/lang/String
4: dup
5: iconst_0
6: ldc #3; //String aa
8: aastore
9: dup
10: iconst_1
11: ldc #4; //String bb
13: aastore
14: astore_1
15: aload_1
16: astore_2
17: aload_2
18: arraylength
19: istore_3
20: iconst_0
21: istore 4
23: iload 4
25: iload_3
26: if_icmpge 49 //貌似每次都比较了!!!!!!!
29: aload_2
30: iload 4
32: aaload
33: astore 5
35: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
38: aload 5
40: invokevirtual #6; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
43: iinc 4, 1
46: goto 23
49: return
for(int i=0;i<200;i++){
System.out,println(a[i]);
}再编译看看