前回、比較に使う 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 str1 = new String( "Hello" ); String str2 = new String( "Hello" );このようにすると、それぞれに指定した文字列の場所が用意され、その参照が各々 str1, str2 に入ります。
(1) は、compareTo が int の値を返すのに真偽判定をしているので、コンパイル・エラーとなります。
if( str1.compareTo( str2 ) == 0 ) と書くべきです。
(3) の == は、文字列内容の比較には使えません。上記の説明の通りです。