-3

Where is the difference between those two kinds of declaration for 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);
    }
}

My task-manager says the first one doesn't need as much as CPU as the second one. So Java compiles the two samples in two different ways? But how.

Thank you for your help!

mrbela
  • 4,477
  • 9
  • 44
  • 79

1 Answers1

8

There is no difference!

The generated bytecode is the same, except that declaring the fields in opposite order makes them get assigned different "register" numbers.

Naming your two methods test1 and test2, then compiling and decompiling the code (using javap -c), shows this:

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."<init>":(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."<init>":(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
Andreas
  • 154,647
  • 11
  • 152
  • 247
  • My answer did seem familiar, so marked question as duplicate of http://stackoverflow.com/questions/33357585/why-declaration-inside-loops-seems-to-be-faster-then-declaration-outside-loops-i/33358058#33358058 – Andreas Dec 17 '15 at 18:31