技術って習ったことがすべてではないんだなぁ。

僕はJavaで文字列の比較をするときは、String#equals()を使って比較するしなさいって習った。先生の説明に(文系の大学だけどなぜかJavaの講義があった)にも納得してString#equals()を使い続けてた。
Stringはプリミティブ値じゃなくてオブジェクトになるので==を利用すると、その文字の比較ではなくて同一参照か否かを確認するから結果はfalseになっちゃうよという説明。中途半端に知っていたのでその説明には納得。でも違った。

class Test
{
    public static void main(String args[])
    {
        String str1 = "Hello";
        String str2 = "Hello";

        if(str1 == str2){
            System.out.println("実行されちゃう><。");
        }

        String str3 = new String("Hello");
        String str4 = new String("Hello");

        if(str3 == str4){
            System.out.println("実行されないよ><");
        }
    }
}

結果は上に書いたとおりで。"Hello"のように初期化したコードに関しては値を比較してくれる。調べてみてると"Hello"みたいにダブルクオーテーションで囲むとプログラマがプリミティブ値として扱いたいっていう意思をJVMがくみとってくれて、==とすると値としての比較が行われるみたい。ちなみに私の環境はJava5.0/6。
==で一致比較してくれるといってもString#equalsを利用するにはかわりはありませんが…。実行速度とかどうなんだろ?やってみよう。