java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

文字列を比較する

投稿日:

最終更新日:2016年07月04日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

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

  1. 長さが等しい場合、char配列i番目同士の差を返却する。
  2. 長さが異なる場合、文字列の長さの差を返却する。

以下、この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メソッドを作ってない場合は注意が必要です。)