変数に格納されている値がある整数と等しいかどうかは「==」演算子を使って次のように確認できる。

これに対して文字列が他の文字列と等しいかどうか調べる場合には注意が必要となる。

次の例を試すと…

結果は「等しい」と出る。

次にもう一つ例を試すと…

今度は「等しくない」と表示される。

Stringクラスの変数は参照型なので、Stringクラスのインスタンスを参照している参照値が入っている。

どちらも同じ文字列である”abc”を表すStringクラスのインスタンスだが、1回目の場合は内部的に

のような動きをしている為、「等しい」とでる。

(Java内部では、同じ文字列の変数を宣言すると、リソースを節約するために参照渡し参照値の値渡しを行う)

しかし、2回目の場合は同じ文字列であっても「str2 = str2 + “c”;」を実行した時に新たにインスタンスを作成(new String())し、文字列”abc”を格納した後でそのインスタンスの参照値を変数に代入している。

従って、変数「str1」と変数「str2」に代入されたインスタンスの参照値は異なる。

この為、同じ文字列が格納されているかどうかを調べる時には「==」演算子は利用できない。

 

equalsメソッド

オブジェクトが同一なのかを調べるのではなく、オブジェクトに格納されている文字列が等しいかどうかを調べるにはStringクラスで用意されているequalsメソッドを使用する。

この場合、文字列オブジェクト1が表す文字列と文字列オブジェクト2が表す文字列が同じであった場合にtrueとなる。

これを先ほどの例に当てはめると…

今度は変数「str1」と変数「str2」に代入されているインスタンスの参照値は異なるが、インスタンスに入っている文字列は同じなので「等しい」と表示される。

今回はどちらも変数に代入したものを比較しているが、次のようにどちらかを文字列の値で記述しても構わない。

 

サンプル