【Java】Java上での文字列の比較

 よろしくお願いします。やぎです。

今回はJavaの文字列比較について、気になったことの備忘録となります。


先日、String型変数を操作しようとEclipseの入力補助を使用していたら候補に「compareTo」がありました。
compareToは数値型などではよく使用していますが、文字列でも使用できることを初めて意識しました。


Javaで文字列を比較する場合、「==」を使用してはいけないことは有名です。
「==」はインスタンスの比較となり、文字列が一致していてもインスタンスが不一致の場合falseとなるため。

セオリーでは、Javaで文字列の比較は「equals」で行います。

「compareTo」はどのような動きをするのでしょうか。(なんとなく想像はつきますが)


困ったときはJavadocの出番です。

上記ページの「public int compareTo(String anotherString)」より引用。

2つの文字列を辞書的に比較します。比較は文字列内のそれぞれの文字のUnicode値に基づいて行われます。このStringオブジェクトによって表される文字シーケンスが、引数文字列によって表される文字シーケンスと辞書的に比較されます。このStringオブジェクトが辞書的に引数文字列より前にある場合は、結果は負の整数になります。このStringオブジェクトが辞書的に引数文字列の後ろにある場合、結果は正の整数になります。それらの文字列が等しい場合、結果はゼロになります。compareToから0が返されるのは、equals(Object)メソッドからtrueが返される場合だけです。


どうやらUnicode値のインデックスを比較するようですね!
スッキリしました。
せっかくなので、比べてみましょう。

検証用ソース
----------------------------------------------------------------------------------------------------
public void test() {
  String str1 = "yagi";
  String str2 = new String("yagi");
  System.out.println("「==」での比較 -> " + (str1 == str2));
  System.out.println("「equals」での比較 -> " + str1.equals(str2));
  System.out.println("「compareTo」での比較 -> " + str1.compareTo(str2));
 }
----------------------------------------------------------------------------------------------------
結果
----------------------------------------------------------------------------------------------------
「==」での比較 -> false
「equals」での比較 -> true
「compareTo」での比較 -> 0
----------------------------------------------------------------------------------------------------

Java経験者には当たり前の結果ですね。
「equals」と「compareTo」は正常に比較できていますね。
ただし、文字列が一致することを判定するために「compareTo」を使用するとソースの可読性が下がるため、あまり使用しないようにしましょう。


まとめ
  • 文字列の比較には「equals」を使用すれば良い
  • 間違っても「==」を使用しない

それでは。

コメント