導入
Java開発において、文字列の比較は最も頻繁に行う操作の一つです。しかし、「==」演算子を使ってしまい意図した結果が得られなかった経験はありませんか?Javaでは、文字列は参照型であるため、比較には専用のメソッドを使用する必要があります。本記事では、文字列比較の基本から、大文字小文字を区別しない比較、辞書順比較まで、現場で必須の知識を解説します。
基礎知識
Javaにおいて、Stringはオブジェクトです。「==」はオブジェクトの「参照先(メモリ上のアドレス)」を比較するため、内容が同じでもインスタンスが異なればfalseとなります。内容の比較には以下のメソッドが必須です。
equals(): 文字列の内容が完全に一致するかを判定します(大文字小文字を区別)。
equalsIgnoreCase(): 大文字小文字の区別をせず、内容のみを比較します。
compareTo(): 辞書順で比較し、結果を整数で返します。ソート処理などで利用されます。
実装/解決策
比較メソッドを利用する際、最も注意すべきなのはNullPointerException(NPE)です。比較対象の変数がnullである場合、メソッドを呼び出すとクラッシュします。現場では「定数側を左辺に置く(Yoda記法)」ことで、安全に記述するのが定石です。
サンプルプログラム
以下のコードは、文字列比較の基本パターンを網羅したものです。そのままコピーして動作を確認してみてください。
public class StringCompareExample {
public static void main(String[] args) {
String input = "Java";
String target = "java";
// 1. equalsによる比較(大文字小文字を区別)
// 定数を左側に置くことでnullでも安全に判定可能
if ("Java".equals(input)) {
System.out.println("一致しました。");
}
// 2. equalsIgnoreCaseによる比較(大文字小文字を無視)
if (input.equalsIgnoreCase(target)) {
System.out.println("大文字小文字を無視して一致しました。");
}
// 3. compareToによる比較
// 戻り値: 0なら一致、負なら辞書順で前、正なら辞書順で後ろ
int result = input.compareTo("Kotlin");
if (result < 0) {
System.out.println("「Java」は「Kotlin」より辞書順で前です。");
}
}
}
応用・注意点
1. Optionalとの組み合わせ: Java 8以降では、値がnullかもしれない場合にOptional.ofNullable(str).filter(s -> s.equals("target")).isPresent() のように記述することで、nullチェックをスマートに行えます。
2. 大量の比較: ループ内で大量の文字列比較を行う場合、compareTo()の結果を利用して二分探索などを検討してください。
3. レコード(Records)との親和性: Java 14から導入されたRecord型では、フィールドの比較は自動生成されるequals()に任せることができます。文字列を含むレコードの比較も、標準のequals()で正しく動作するため、手動での実装は避け、可能な限りフレームワークや言語仕様を活用しましょう。
これらの基本を押さえるだけで、コードの堅牢性は格段に向上します。ぜひ明日からの実装に役立ててください。

コメント