Thinkers'Studio
JavaとC言語の自習ツール
== について知っておきたいこと

 前回、比較に使う equals と compareTo を説明しました。
 今回は == について少し説明します。

 == は、2つの項の値が同じかどうかを比較する演算子です。
 項が変数の場合は、変数に格納されている値と比較します。 int などの基本データ型なら、値の比較ができます。
 しかし、項が String型などのオブジェクトである場合、メモリ上に用意された場所への「参照」が入っているので、参照先が同じかどうかを比較することになります。 内容の比較ではないので注意しましょう。

【内容の比較でないことが分かる例】
下は、前回の文字列比較クイズから == だけを確認するように変えたプログラムです。
class CompareTest {
    public static void main( String[] args ) {
        String str1 = "Hello";
        String str2 = "Hello";
        if( str1 == str2 ) System.out.println( "同じ" );
        else               System.out.println( "違う" );

        str1 += " everyone.";
        str2 += " everyone.";
        if( str1 == str2 ) System.out.println( "(演算後)同じ" );
        else               System.out.println( "(演算後)違う" );
    }
}
 実行すると、次の結果が表示されます。
同じ
(演算後)違う

[実行結果1行目はどうして?] 参照先が同じだからです。
Java の Stringオブジェクトは、不変であるため共用することができます。 同じ "Hello" という定数文字列を代入して Stringオブジェクトを作ったので、同じ場所への参照が str1 と str2 に入りました。

[実行結果2行目はどうして?] 参照先が変わったからです。
文字列連結などの演算をすると、内部では String以外のクラスの機能が働くので、同じ文字列を使っても別の場所が用意され参照先が変わるようです。 文字列の比較には、== を使わないようにしましょう。

(今回のクイズです)
 Stringオブジェクトは、new 演算子を使って初期化することもできます。
  String str1 = new String( "Hello" );
  String str2 = new String( "Hello" );
 このようにすると、それぞれに指定した文字列の場所が用意され、その参照が各々 str1, str2 に入ります。
 == で比較するとどうなるか予想してみましょう。
   (答えは、次回の Java の Tips で)
前回のクイズの答え: (2) が正しい (前回の問題を見る

(1) は、compareTo が int の値を返すのに真偽判定をしているので、コンパイル・エラーとなります。
  if( str1.compareTo( str2 ) == 0 ) と書くべきです。
(3) の == は、文字列内容の比較には使えません。上記の説明の通りです。