Java FAQ:new String("abc") という書き方

Java FAQ:S008 Q-07

public class C2008040600 {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = "abc";
    }
}

コンパイルした後、javap -c を実行

Compiled from C2008040600.java
public class C2008040600 extends java.lang.Object {
    public C2008040600();
    public static void main(java.lang.String[]);
}

Method C2008040600()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 new #2 <Class java.lang.String>
   3 dup
   4 ldc #3 <String "abc">
   6 invokespecial #4 <Method java.lang.String(java.lang.String)>
   9 astore_1
  10 ldc #3 <String "abc">
  12 astore_2
  13 return

invokespecial が入るのが違うようだ。


なんとなく、以下がどうなるか確かめてみた。
あらかじめ計算されるようだ。

public class C2008040603 {
    public static void main(String[] args) {
        String s1 = new String("abc" + "def");
        String s2 = "abc" + "def";
    }
}

コンパイルした後、javap -c を実行

Compiled from C2008040603.java
public class C2008040603 extends java.lang.Object {
    public C2008040603();
    public static void main(java.lang.String[]);
}

Method C2008040603()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 new #2 <Class java.lang.String>
   3 dup
   4 ldc #3 <String "abcdef">
   6 invokespecial #4 <Method java.lang.String(java.lang.String)>
   9 astore_1
  10 ldc #3 <String "abcdef">
  12 astore_2
  13 return