Javaで文字列を比較する方法|equals()とequalsIgnoreCase()の使い分けを徹底解説
Javaで文字列の等価性を比較する際は、Stringクラスが提供するequalsメソッドまたはequalsIgnoreCaseメソッドを使用するのが基本です。この記事では、それぞれのメソッドの使い方に加えて、==演算子で文字列を比較してはいけない理由についても詳しく解説します。
equals()メソッドで文字列を比較する
2つの文字列を比較し、大文字と小文字の違いまで厳密に判定したい場合はequals()メソッドを使用します。
次のコード例では、2つのStringインスタンスが大文字小文字を含むすべての文字において一致しているかどうかを判定しています。
public class CompareTwoStrings {
public static void main(String[] args) {
String firstString = "Test123";
String secondString = "Test" + 123;
String thirdString = "TEST123";
if (firstString.equals(secondString)) {
System.out.println("1つ目と2つ目の文字列は等しい");
}
if (firstString.equals(thirdString)) {
System.out.println("1つ目と3つ目の文字列は等しい");
}
}
}
実行結果:
1つ目と2つ目の文字列は等しい
ポイント:2つ目の出力は表示されません。firstStringとthirdStringでは大文字小文字が異なるためです。
equalsIgnoreCase()メソッドで文字列を比較する
大文字小文字の違いを無視して文字列を比較したい場合は、equalsIgnoreCase()メソッドを使用します。
先ほどのコード例で.equals()を.equalsIgnoreCase()に置き換えると、両方の出力文が実行されます。
public class CompareTwoStrings {
public static void main(String[] args) {
String firstString = "Test123";
String secondString = "Test" + 123;
String thirdString = "TEST123";
if (firstString.equalsIgnoreCase(secondString)) {
System.out.println("1つ目と2つ目の文字列は等しい");
}
if (firstString.equalsIgnoreCase(thirdString)) {
System.out.println("1つ目と3つ目の文字列は等しい");
}
}
}
実行結果:
1つ目と2つ目の文字列は等しい
1つ目と3つ目の文字列は等しい
==演算子で文字列を比較してはいけない理由
注意:Javaで2つの文字列を比較するとき、==や!=演算子は使用しないでください。
これらの演算子は実際には参照(オブジェクトが格納されている場所)を比較しており、複数のStringオブジェクトが同じ文字列を表すことがあるため、誤った結果になる可能性があります。
代わりに、文字列の「値」に基づいて比較を行うString.equals(Object)メソッドを使用しましょう。
public class CompareTwoStrings {
public static void main(String[] args) {
String firstString = "Test123";
String secondString = "Test123";
String thirdString = new String("Test123");
if (firstString == secondString) {
System.out.println("1つ目と2つ目の文字列は等しい");
}
if (firstString == thirdString) {
System.out.println("1つ目と3つ目の文字列は等しい");
}
}
}
実行結果:
1つ目と2つ目の文字列は等しい
ポイント:2つ目の出力は表示されません。new String()で生成されたオブジェクトは、文字列リテラルとは別の参照を持つためです。
定数値との文字列比較
文字列を定数値と比較する場合、定数値をequalsの左側に置くことで、比較対象の文字列がnullだった場合でもNullPointerExceptionが発生しないようにできます。
例:
"baz".equals(foo)
foo.equals("baz")はfooがnullの場合にNullPointerExceptionをスローしますが、"baz".equals(foo)は単にfalseと評価されるだけです。
より読みやすい代替手段として、両引数に対してnullチェックを行ってくれるObjects.equals()を使用する方法もあります。
例:Objects.equals(foo, "baz")
switch文で文字列を比較する
Java 1.7以降では、switch文でString型の変数をリテラルと比較できるようになりました。ただし、対象の文字列がnullの場合は必ずNullPointerExceptionがスローされるため注意が必要です。値の比較にはString.equalsが使われるため、大文字小文字が区別されます。
public class CompareTwoStrings {
public static void main(String[] args) {
String stringToSwitch = "A";
switch (stringToSwitch) {
case "a":
System.out.println("a");
break;
case "A":
System.out.println("A"); // ここが実行される
break;
case "B":
System.out.println("B");
break;
default:
break;
}
}
}
まとめ
この記事では、コード例とともにJavaにおける文字列比較の方法を解説しました。大文字小文字を区別したい場合は.equals()を、区別したくない場合は.equalsIgnoreCase()を使用しましょう。
また、==演算子は参照を比較するものであり値を比較しないため、文字列の比較には決して使用しないでください。
関連記事
- JavaでtoString()をオーバーライドすべき理由
- Javaで文字列を反転(逆順)する方法
- 文字列から数値を抽出する方法
- JavaでStringをintに変換する方法
-
JavaでCLOB型を文字列(String)に変換する方法をわかりやすく解説
CLOB(Character Large Object)は、SQLの組み込みデータ型の一つで、大量のテキストデータを格納するために使用されます。このデータ型を利用すると、最大2,147,483,647文字までのデータを保存することが可能です。 JDBC APIのjava.sql.Clobインターフェースが、このCLOBデータ型を表現します。なお、JDBCにおけるClobオブジェクトはSQLロケーター(locator)を使って実装されているため、実際のデータそのものではなく、SQL CLOBへの論理ポインターを保持している点に注意してください。 MySQLデータベースでは、TINYTEXT、T
-
JavaでJSONファイルを文字列(String)として読み込む方法
この記事では、JavaでJSONファイルをString型の変数として読み込む方法を解説します。特にAPIテストの際に、エンドポイントへJSONペイロードをPOSTしたいケースなどで非常に便利なテクニックです。 JSONペイロードをあらかじめファイルとして保存しておき、そのファイルを文字列として読み込めば、POSTリクエストのボディとしてそのまま利用できます。 JSONファイルを文字列として読み込む基本手法 まず、以下の場所にJSONファイルが配置されているものと仮定します。 src/test/resources/myFile.json { name:David, age:30, h