こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

文字列を比較する

こんにちは。「Javaを復習する初心者」です。今回は文字列を比較するメソッドString#compareToメソッドを使ってみました。public int compareTo(String anotherString)です。Stringオブジェクト自身と引数のanotherStringを辞書式の順序で比較するメソッドです。

このメソッドは整数値を返却します。Stringオブジェクトが引数文字列より辞書式の順序で前、同じ、後ろに対して、それぞれ負の数、0、正の数を返却します。という風にAPI仕様書の説明の前半部分に書いてあります。後半は複雑に見えましたが、大雑把に書くと以下のようです。

  1. 長さが等しい場合、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チェックはしていないようです。NullPointerExceptionが発生します。

このメソッドを知ると、文字列が等しいことを判定するために「a.compareTo(b) == 0」と書いてしまいそうですが、そのような場合はequalsメソッドがありますので注意です。オブジェクトが等しいかどうかを調べる場合はequalsメソッドを使います。(ただし、そのクラスがequalsメソッドを正しくオーバーライドしている必要があります。自前のクラスでequalsメソッドを作ってない場合は注意が必要です。)