当前位置:  开发笔记 > 编程语言 > 正文

Java关于性能的变量声明之间的区别

如何解决《Java关于性能的变量声明之间的区别》经验,为你挑选了1个好方法。

这两种声明之间的区别在哪里String s:

1)

public static void main(String[] args) {
    String s;

    for (int i = 0; i < 1000000; i++) {
        s = "String" + i;
        System.out.println(s);
    }
}

2)

public static void main(String[] args) {
    for (int i = 0; i < 1000000; i++) {
        String s = "String" + i;
        System.out.println(s);
    }
}

我的任务经理说第一个不需要CPU和第二个.那么Java以两种不同的方式编译这两个样本?但是怎么样.

谢谢您的帮助!



1> Andreas..:

没有区别!

生成的字节码是相同的,除了以相反的顺序声明字段使得它们被分配不同的"寄存器"号.

命名你的两个方法test1test2,然后编译和反编译的代码(使用javap -c),显示了这个:

public static void test1();
  Code:
     0: iconst_0
     1: istore_1
     2: goto          32
     5: new           #22                 // class java/lang/StringBuilder
     8: dup
     9: ldc           #24                 // String String
    11: invokespecial #26                 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
    14: iload_1
    15: invokevirtual #29                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
    18: invokevirtual #33                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    21: astore_0
    22: getstatic     #37                 // Field java/lang/System.out:Ljava/io/PrintStream;
    25: aload_0
    26: invokevirtual #43                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
    29: iinc          1, 1
    32: iload_1
    33: ldc           #48                 // int 1000000
    35: if_icmplt     5
    38: return

public static void test2();
  Code:
     0: iconst_0
     1: istore_0
     2: goto          32
     5: new           #22                 // class java/lang/StringBuilder
     8: dup
     9: ldc           #24                 // String String
    11: invokespecial #26                 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
    14: iload_0
    15: invokevirtual #29                 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
    18: invokevirtual #33                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
    21: astore_1
    22: getstatic     #37                 // Field java/lang/System.out:Ljava/io/PrintStream;
    25: aload_1
    26: invokevirtual #43                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
    29: iinc          0, 1
    32: iload_0
    33: ldc           #48                 // int 1000000
    35: if_icmplt     5
    38: return

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有