Java的新特性enhanced for loop为什么好?

marshallzh 2010-10-19 12:05:11

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的这个新特性都有什么具体的好处呢?
请大家谈谈,多谢。
...全文
556 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
marshallzh 2010-10-31
  • 打赏
  • 举报
回复
Thanks all for your answers!
axman 2010-10-21
  • 打赏
  • 举报
回复
那一段是循环控制,和检查数据越界有什么关系。

int a[] = new int[200]; //大于10,否则会被内置常数指令优化
for(int i=0;i<200;i++){
System.out,println(a[i]);
}

再编译看看
「已注销」 2010-10-20
  • 打赏
  • 举报
回复
Java一直在努力,降低程序员的简单体力劳动,让大家把精力放在更重要的地方去,而不是天天打这些简单的代码

对于数组来说,for-each,编译后和直接用 for(int i=0;i<array.length;i++) 是一样的。编译器在编译时自动帮你处理好了.对于集合,则使用迭代器来实现
axman 2010-10-20
  • 打赏
  • 举报
回复
千万不要故意把arr.length计算出来放在for中。认为是优化,其实不懂编译器优化原理。
axman 2010-10-20
  • 打赏
  • 举报
回复
新特性比上面那一段性能要高很多。
因为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]就不可能越界。
所以不会增加检查越界的代码。

若鱼1919 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 axman 的回复:]
新特性比上面那一段性能要高很多。
因为5这个常量对编译器来说它根本就是一个变通的常量,所以在编译时每个循环中要加入
检查i是否已经越界的操作。每次循环至少多出三条指令。


而如果是
for(int a:arr)
System.out.println("Output: "+ a);
就一定会当作
for(int i = 0;i<arr.length;i++)
Syste……
[/Quote]

不知道兄台用的是哪个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
24K純帥 2010-10-20
  • 打赏
  • 举报
回复
新特性,俺以为JDK7出了呢
约翰羊 2010-10-20
  • 打赏
  • 举报
回复
省事儿......
小9 2010-10-19
  • 打赏
  • 举报
回复
这是JDK5带来的新东西
其实就这样用就好了
觉得爽、方便,就是好
closewbq 2010-10-19
  • 打赏
  • 举报
回复
这个特性真新- -!
龙四 2010-10-19
  • 打赏
  • 举报
回复
好处参见《Effective java》
龙四 2010-10-19
  • 打赏
  • 举报
回复
这叫什么新特性。。。
若鱼1919 2010-10-19
  • 打赏
  • 举报
回复
如果是遍历数组,从速度上来说,应该是arr[i]这种速度快
如果是集合,速度应该是差不多的

感觉纯粹属于个人喜好,没有啥新鲜的
Miracle1216 2010-10-19
  • 打赏
  • 举报
回复
就是方便了点,也不总是方便的
NewMoons 2010-10-19
  • 打赏
  • 举报
回复
就是方便访问了,当不需要随机访问时不需要一个多余的临时变量,没别的。
就跟 i = i + 1 写成 i+=1 和 i++ 一样的道理
没达到设计模式上的深度
黎某人 2010-10-19
  • 打赏
  • 举报
回复
LZ在用1.4的JDK 偶尔开始用1.5or1.6的时候才有了这个感慨吗
zrcvic 2010-10-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 marshallzh 的回复:]

……是相对新……
那么比起旧的for()有什么优点呢?

引用 1 楼 ticmy 的回复:

这叫什么新特性。。。
[/Quote]
首先,简洁明了一些,如果你不觉得变简单了,那是没有用习惯

其次,使用临时变量 i 必须手动计算集合大小,而且只能用于 随机访问容器 上面,而顺序迭代适用范围更广。关于迭代器的用途和威力,不在本问题的讨论范围之内……
longquanping 2010-10-19
  • 打赏
  • 举报
回复
marshallzh 2010-10-19
  • 打赏
  • 举报
回复
呵呵,这个说法好!
学习了。
[Quote=引用 6 楼 zdjray 的回复:]

语法糖
[/Quote]
marshallzh 2010-10-19
  • 打赏
  • 举报
回复
……是相对新……
那么比起旧的for()有什么优点呢?

[Quote=引用 1 楼 ticmy 的回复:]

这叫什么新特性。。。
[/Quote]
加载更多回复(1)

62,636

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧