【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");
String str2 = new String("yagi");
System.out.println("「==」での比較 -> " + (str1 == str2));
System.out.println("「equals」での比較 -> " + str1.equals(str2));
System.out.println("「compareTo」での比較 -> " + str1.compareTo(str2));
System.out.println("「equals」での比較 -> " + str1.equals(str2));
System.out.println("「compareTo」での比較 -> " + str1.compareTo(str2));
}
----------------------------------------------------------------------------------------------------
結果
----------------------------------------------------------------------------------------------------
「==」での比較 -> false
「equals」での比較 -> true
「compareTo」での比較 -> 0
「compareTo」での比較 -> 0
----------------------------------------------------------------------------------------------------
Java経験者には当たり前の結果ですね。
「equals」と「compareTo」は正常に比較できていますね。
ただし、文字列が一致することを判定するために「compareTo」を使用するとソースの可読性が下がるため、あまり使用しないようにしましょう。
まとめ
- 文字列の比較には「equals」を使用すれば良い
- 間違っても「==」を使用しない
それでは。
コメント
コメントを投稿