移転しました。

JavaのStringの微妙なポジション

[Java]技術って習ったことがすべてではないんだなぁ。
こちらのエントリを読ませて頂いたのをきっかけに。コメント欄に凡そ書いてあるけれど、補足としてはJava5からはオートボクシングなので

public class Test {
    public static void main(String[] args) {
        Integer a = 1;
        Integer b = 1;
        Boolean c = true;
        Boolean d = true;
        System.out.println(a == b);
        System.out.println(c == d);
    }
}

こういうのもtrueになる。
""を内部的にプリミティブとして解釈しているかというのはjavap -cで逆アセンブルすると見当がつくと思う。例えば、

public class Test {
    public static void main(String[] args) {
        char a = 'w';
        String b = "w";
    }
}

というコードを逆アセンブルすると

Code:
 0:   bipush  119
 2:   istore_1
 3:   ldc     #2; //String w
 5:   astore_2
 6:   return

という結果になる(環境はJDK 5.0 Update 12)。istoreは数値の格納だけれどもastoreはオブジェクト参照の格納なので、""はちゃんとStringオブジェクトとして認識されている筈。数値や""やtrue/falseはシンタックスに依存していてnewキーワードなしに生成できるから、ものすごく最適化されるのだと思う。
だいぶ以前に、Stringを使った文字列結合とStringBufferを使った文字列結合の比較をやってみたけれど、Stringはかなり最適化されるので""で埋め込まれた定数の場合は+を使って結合しても全く遅くならなかった(当然、String変数を消したり増やしたりする場合はStringBuilderかStringBufferを使うほうが遥かに効率的で、あくまで""の話)。
こういうnew要らずで生成できるオブジェクトがあったり、Stringが+を演算子オーバーライドしていたり、純粋なオブジェクト指向としてはあまり良くないと思ったこともあったけれど、C#とかと戦うには実用面から必要な妥協なのだろうなと今は思っている。