こんにちは。「Javaを復習する初心者」です。
今回は文字列を比較するメソッドString#compareToメソッドを使ってみました。public int compareTo(String anotherString)です。Stringオブジェクト自身と引数のanotherStringを辞書式の順序で比較するメソッドです。このメソッドは整数値を返却します。Stringオブジェクトが引数文字列より辞書式の順序で前、同じ、後ろに対して、それぞれ負の数、0、正の数を返却します。という風にAPI仕様書の説明の前半部分に書いてあります。後半は複雑に見えましたが、大雑把に書くと以下のようです。
- 長さが等しい場合、char配列i番目同士の差を返却する。
- 長さが異なる場合、文字列の長さの差を返却する。
以下、この2つの動きを見ていきます。
文字列”abc”と比較
今回は実験的に以下のプログラムを実行してみました。文字列”abc”を色々な文字列と比較しています。
ソースコード
package stringTest;
public class HelloCompareTo {
public static void main(String[] args) {
String str = "abc";
System.out.println(str.compareTo("aba"));
System.out.println(str.compareTo("abb"));
System.out.println(str.compareTo("abc"));
System.out.println(str.compareTo("abd"));
System.out.println(str.compareTo("abe"));
System.out.println(str.compareTo("abf"));
System.out.println();
System.out.println(str.compareTo("a"));
System.out.println(str.compareTo("ab"));
System.out.println(str.compareTo("abca"));
System.out.println(str.compareTo("abcab"));
}
}
結果
2
1
0
-1
-2
-3
2
1
-1
-2
前半は以下のような結果です。”abc”と比較している文字列がすべて3文字で2文字目まで同じなので、3文字目の文字コードの差が出力されています。
引数 | 返却値 |
---|---|
aba | 2 |
abb | 1 |
abc | 0 |
abd | -1 |
abe | -2 |
abf | -3 |
後半は文字数の差が出力されています。先頭から途中まで文字列が同じ場合、文字列が短い方が辞書式の順序で前です。
引数がnullの場合
このメソッドの引数ですが、空文字は大丈夫なのですが、nullの場合、エラーが出ます。以下、試してみました。
ソースコード
package stringTest;
public class HelloCompareToEtc {
public static void main(String[] args) {
String str = "abc";
System.out.println(str.compareTo(""));
System.out.println(str.compareTo(null));
}
}
結果
3
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.compareTo(String.java:1155)
at stringTest.HelloCompareToEtc.main(HelloCompareToEtc.java:10)
メソッドのソースを眺めたのですが、特にnullチェックはしていないようです。そのため、nullをこのメソッドに渡してしまうと、NullPointerExceptionが発生します。
このメソッドを知ると、文字列が等しいことを判定するために「a.compareTo(b) == 0」と書いてしまいそうですが、そのような場合はequalsメソッドがありますので注意です。オブジェクトが等しいかどうかを調べる場合はequalsメソッドを使います。(ただし、そのクラスがequalsメソッドを正しくオーバーライドしている必要があります。自前のクラスでequalsメソッドを作ってない場合は注意が必要です。)