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的这个新特性都有什么具体的好处呢?
请大家谈谈,多谢。

解决方案 »

  1.   

    这是JDK5带来的新东西
    其实就这样用就好了
    觉得爽、方便,就是好
      

  2.   

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

  3.   

    LZ在用1.4的JDK 偶尔开始用1.5or1.6的时候才有了这个感慨吗
      

  4.   

    就是方便访问了,当不需要随机访问时不需要一个多余的临时变量,没别的。
    就跟 i = i + 1 写成 i+=1 和 i++ 一样的道理
    没达到设计模式上的深度
      

  5.   

    如果是遍历数组,从速度上来说,应该是arr[i]这种速度快
    如果是集合,速度应该是差不多的感觉纯粹属于个人喜好,没有啥新鲜的
      

  6.   

    Java一直在努力,降低程序员的简单体力劳动,让大家把精力放在更重要的地方去,而不是天天打这些简单的代码对于数组来说,for-each,编译后和直接用 for(int i=0;i<array.length;i++) 是一样的。编译器在编译时自动帮你处理好了.对于集合,则使用迭代器来实现
      

  7.   

    新特性比上面那一段性能要高很多。
    因为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]就不可能越界。
    所以不会增加检查越界的代码。
      

  8.   

    千万不要故意把arr.length计算出来放在for中。认为是优化,其实不懂编译器优化原理。
      

  9.   


    不知道兄台用的是哪个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
      

  10.   

    那一段是循环控制,和检查数据越界有什么关系。int a[] = new int[200]; //大于10,否则会被内置常数指令优化
    for(int i=0;i<200;i++){
       System.out,println(a[i]);
    }再编译看看
      

  11.   

    Thanks all for your answers!