JavaのString.compareToメソッドについて

そもそも「compareTo」メソッドとは

【エンジニア募集中】フルリモート可◎、売上/従業員数9年連続UP、平均残業8時間、有給取得率90%、年休124日以上 etc.  詳細はこちらから>

compareToメソッドは「文字列、値を比較する」メソッドで、String型の他にもInteger型などにも実装されているメソッドです。

単純な使い方としては、上記のような使い方をします。
retの戻り値は3パターンになり、

  • str1がstr2よりも大きい値の場合:正の値が戻る

  • str1がstr2よりも小さい値の場合:負の値が戻る

  • str1とstr2が等しい値の場合:0が戻る

となります。

比較される「値」とは?

先のコードはstr1とstr2に代入されている値が数字なので直感的ですが、String型には当然数字以外の文字列が代入されているパターンが多いです。
では、以下のようなコードの場合、retの値はどのようになるでしょうか。

答えですが、retには「負の値」が戻ります。
なぜなら、String.comareToは代入されている文字列のUnicode値で比較を行うからです。
aよりもbの方がUnicode値が小さいということです。

初心者が陥るString.comareToの罠

では、次のようなコードの場合には、retの値はどのようになるでしょうか。

答えは「負の値」となります。

str1に代入された文字列「1001」よりも、str2に代入された文字列「101」の方が大きいということです。String.comareToメソッドは、Unicode値を「辞書的に比較」しているために、先頭から3文字、つまりstr1に代入された「1001」の「100」の部分と、str2に代入された「101」が比較された結果、str2の方が「値が大きい」と判断されます。

適切な型変換はとても大切です

以上のことから、「比較」の罠に陥ることのないように、比較をする際には適切な型変換を行う必要があることがわかります。
Javaに限らず、比較をする時には「型」を意識しましょう。

【エンジニア募集中】フルリモートも◎(リモート率85.7%)、平均残業8時間、年休124日以上、有給取得率90% etc. 詳細はこちらから>

Smallitのサービス