java 中循环内部使用的变量,需要定义在循环外部吗?编译器会不会自动进行优化?
例如: 
 一: 
 for(int   i=0;i <1000;i++){ 
          Integer   i   =   new   Integer(i); 
          System.out.println(i.intValue()); 
 } 
 这里需要把   Integer   i   定义在for   循环外面,变成   
 二: 
 Integer   i   =   null; 
 for(int   i=0;i <1000;i++){ 
             i   =   new   Integer(i); 
          System.out.println(i.intValue()); 
 }   
 二的写法开销会不会更小?一的写法编译器编译后的代码回自动优化成二的吗?   
------解决方案--------------------看来我还是没讲清楚~ 
 for(int i=0;i <1000;i++){ 
    Integer x = new Integer(i); 
    System.out.println(x.intValue()); 
 } 
 对应的jvm指令为: 
 0:   iconst_0 
 1:   istore_1 
 2:   iload_1 
 3:   sipush  1000 
 6:   if_icmpge       34 
 9:   new     #2; //class java/lang/Integer 
 12:  dup 
 13:  iload_1 
 14:  invokespecial   #3; //Method java/lang/Integer. " <init>  ":(I)V 
 17:  astore_2 
 18:  getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream; 
 21:  aload_2 
 22:  invokevirtual   #5; //Method java/lang/Integer.intValue:()I 
 25:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V 
 28:  iinc    1, 1 
 31:  goto    2 
 34:  return 
 ----------------------------------------------- 
 Integer x = null; 
 for(int i=0;i <1000;i++){ 
     x = new Integer(i); 
    System.out.println(x.intValue()); 
 } 
 对应指令为: 
 0:   aconst_null 
 1:   astore_1 
 2:   iconst_0 
 3:   istore_2 
 4:   iload_2 
 5:   sipush  1000 
 8:   if_icmpge       36 
 11:  new     #2; //class java/lang/Integer 
 14:  dup 
 15:  iload_2 
 16:  invokespecial   #3; //Method java/lang/Integer. " <init>  ":(I)V 
 19:  astore_1 
 20:  getstatic       #4; //Field java/lang/System.out:Ljava/io/PrintStream; 
 23:  aload_1 
 24:  invokevirtual   #5; //Method java/lang/Integer.intValue:()I 
 27:  invokevirtual   #6; //Method java/io/PrintStream.println:(I)V 
 30:  iinc    2, 1 
 33:  goto    4 
 36:  return 
 你可以比较一下区别. 
 这就是我为什么说用后一种写法还要多出个null来. 
 另外,这些都是在编译时候已经决定的,写在.class文件里面的.而jvm只会和.class文件打交道. 
 他会严格按照这些指令执行,而不是.java文件写的内容.