文字列値の比較判定(同じ文字列値かどうかの比較判定)において、よく間違いやすいものとして「==」を用いる場合がみうけられます。
「==」はあくまでも「同じオブジェクトかどうか」を比較判定するものであり、誤ってこれを使うと同じ文字列値であるにもかからわずfalseが返されてプログラマーの意図どおりに動作しないことになります。
(「!=」を用いた場合も同様のことが起きます。)
「同じ文字列値かどうか」を比較判定する場合には、必ずequals( )メソッドを利用する必要があります。
以降では、この留意事項を整理し、サンプルプログラムで具体例を用いて説明します。
留意事項
Stringオブジェクトの文字列値の比較判定には、「==」または「!=」でなく、equals( )メソッドを利用する。
【問題点】
文字列値を比較判定(同じ文字列値かどうかを比較判定)したい場合において、「==」または「!=」を利用すると同じ文字列かどうかの比較判定ではなく、同じオブジェクトかどうかを比較判定します。
(※もしオブジェクトの比較判定を前提とする場合は、逆に「==」または「!=」を利用します。)
【改善方法】
文字列値を比較判定(同じ文字列値かどうかを比較判定)したい場合において、equals( )メソッドを利用することで同じオブジェクトかどうかの比較判定ではなく、同じ文字列かどうかを比較判定することができます。
(誤)
(正)
以下にサンプルプログラムをもとに説明します。
まず、文字列値の比較判定で「==」を利用している誤ったコードをご紹介します。
[サンプルプログラム2-1(「==」で比較判定した誤ったコード)]
[実行結果]
このように、Stringオブジェクトの文字列値を比較判定したいにもかかわらず、実行結果は【異なる文字列値】と出力され、プログラマーの意図通りに正しく判定できていません。
次に、文字列値の比較判定でequals( )メソッドで比較判定した正しいコードをご紹介します。
[サンプルプログラム2-2(equals( )メソッドで比較判定した正しいコード)]
[実行結果]
実行結果をみると、このように、【同じ文字列値】として出力され、今度は正しく文字列値が比較判定できていることが確認できます。
これでプログラマーの意図通りに正しく判定できたことになります。
このように、文字列値を比較する場合は、必ずequals( )メソッドを使うように留意する必要があります。
最後に、前回の「第1回:StringとStringBuffer」でもご紹介しましたが、富士通のJava開発規約チェッカ「SIMPLIA/JF Kiyacker」を利用すると、ご紹介した「サンプルプログラム2-1」のチェック(検出)を行うことが可能です。
これにより検出された理由および、どう修正すればよいかを把握することができ、またプログラム中の検出箇所(行数)がダイレクトにわかるため、効率的にプログラム修正を行えます。
「サンプルプログラム2-1」をチェックすると、以下のように規約に違反するコードとして検出されます。
ここでは「strName1」と「strName2」の各ローカル変数ごとに検出されます。
プログラマーはこの検出結果をもとに、コードを修正していきます。 実際に修正したファイルである「サンプルプログラム2-2」をチェックすると、今度は検出されません。
なお、SIMPLIA/JF Kiyackerの詳細につきましては、以下の関連情報をご参照ください。
関連情報
また、本文中でご紹介した2つのサンプルプログラムもこちらからダウンロードできますので、是非ご活用ください。