Javaでは文字列の比較方法がいくつかあり、それぞれ長所と短所があります。最適な方法は、大文字と小文字を区別する必要があるか、等価性をチェックする必要があるか、辞書順を決定する必要があるかによって異なります。このガイドでは、最も一般的な方法を明確にします。
目次
1. compareTo()
による文字列の比較
compareTo()
メソッドは辞書順比較を提供します。戻り値は次のとおりです。
0
:文字列が等しい場合。- 負の値:呼び出し元の文字列が引数の文字列より辞書順で前に来る場合。
- 正の値:呼び出し元の文字列が引数の文字列より辞書順で後に来る場合。
この比較は大文字と小文字を区別します。大文字は小文字より前に来ます。
String str1 = "apple";
String str2 = "banana";
String str3 = "Apple";
int result1 = str1.compareTo(str2); // result1は負の値になる
int result2 = str1.compareTo(str3); // result2は負の値になる(大文字と小文字を区別)
int result3 = str1.compareTo("apple"); // result3は0になる
2. ==
演算子
==
演算子は、文字列の内容ではなく参照を比較します。2つの文字列変数が同じメモリ位置を指しているかどうかをチェックします。これは通常、文字列値を比較する場合に望ましい動作ではありません。
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); // 文字列インターニングにより、多くの場合true
System.out.println(str1 == str3); // false(異なるオブジェクト)
Javaの文字列インターニングによりstr1 == str2
は多くの場合true
を返しますが、これに依存するのは信頼できません。内容の比較には常にequals()
を使用してください。
3. equals()
メソッド
equals()
メソッドは、文字列の内容を比較するための推奨される方法です。メモリ位置を無視して文字を比較します。
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
4. 大文字と小文字の区別とequalsIgnoreCase()
equals()
は大文字と小文字を区別します。”hello”と”Hello”は異なるものと見なされます。大文字と小文字を区別しない比較には、equalsIgnoreCase()
を使用します。
String str1 = "hello";
String str2 = "Hello";
System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
5. contentEquals()
メソッド
contentEquals()
はequals()
に似ていますが、Stringを他のCharSequence
オブジェクト(StringBuffer
やStringBuilder
など)と比較できます。
String str1 = "hello";
StringBuffer str2 = new StringBuffer("hello");
System.out.println(str1.contentEquals(str2)); // true
これは柔軟性を提供しますが、単純な文字列同士の比較には、可読性の面からequals()
が推奨されます。
要約すると、必要に応じて適切なメソッドを選択してください。辞書順にはcompareTo()
、大文字と小文字を区別する内容の等価性にはequals()
、大文字と小文字を区別しない等価性にはequalsIgnoreCase()
、Stringと他のCharSequence
オブジェクトの比較にはcontentEquals()
を使用します。文字列の内容を比較する場合には==
を使用しないでください。