こんにちは!エンジニアの中沢です。
JavaにはString型の文字列を比較するためのequalsメソッドがあります。
equalsメソッドを使わずに、”==”演算子で文字列を比較しようとすると思い通りの結果にならないので注意が必要です。
この記事では、
・equalsメソッドの比較とは
・文字列をequalsメソッドで比較する方法
・equalsIgnoreCaseで大文字と小文字を区別せずに比較する方法
・equalsメソッドで否定の判定をする方法
という基本的な内容から、
・Objectsクラスのequalsメソッドでnullを安全に比較する方法
・equalsメソッドで2つのListを比較しデータを抽出する方法
などの応用的な使い方に関しても解説していきます。
今回はこれらの方法を覚えるために、equalsメソッドのさまざまな使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
equalsメソッドの比較とは
2つの文字列が等しいかどうかの比較をするには、equalsメソッドを使います。
int型などのプリミティブ型の場合は”==”演算子で比較しますが、String型は参照型なのでequalsメソッドで比較する必要があります。
文字列を”==”演算子とequalsメソッドで比較した結果を次のプログラムで確認してみましょう。
public class Main { public static void main(String[] args) { String str1 = "a"; String str2 = "a"; System.out.println("[変更前]"); System.out.println("str1 = " + str1 + ", str2 = " + str2); System.out.println(str1 == str2); str1 = str1 + "b"; str2 = str2 + "b"; System.out.println("[変更後]"); System.out.println("str1 = " + str1 + ", str2 = " + str2); System.out.println(str1 == str2); System.out.println("[equalsで比較]"); System.out.println(str1.equals(str2)); } }
実行結果
[変更前] str1 = a, str2 = a true [変更後] str1 = ab, str2 = ab false [equalsで比較] true
このプログラムでは、”==”演算子を使った1度目の比較で”true”を返していますが、文字列を追加した後の2度目の比較では同じ文字列なのに”false”を返しています。
このように、”==”演算子を使った場合は参照先の文字列が同じでもオブジェクトが違うと”false”を返すため、文字列を比較する場合にはequalsメソッドを使います。
このプログラムの実行結果から、equalsメソッドを使った場合には正しく文字列の比較ができることが確認できました!
String型の文字列をequalsで比較する方法についてはこちらで詳しく解説しているので、ぜひ確認してください!
equalsIgnoreCaseの使い方
ここではequalsIgnoreCaseメソッドの使い方を解説します。
文字列を比較するときに大文字と小文字を区別せずに、同じ文字列として比較したい場合には、equalsIgnoreCaseメソッドを使います。
次のプログラムでequalsIgnoreCaseメソッドの使い方を確認してみましょう。
public class Main { public static void main(String[] args) { String str1 = "abc"; String str2 = "ABC"; System.out.println("[equalsで比較]"); System.out.println(str1.equals(str2)); System.out.println("[equalsIgnoreCaseで比較]"); System.out.println(str1.equalsIgnoreCase(str2)); } }
実行結果
[equalsで比較] false [equalsIgnoreCaseで比較] true
このプログラムでは、equalsメソッドとequalsIgnoreCaseメソッドで文字列を比較した結果をそれぞれ表示しています。
このプログラムの実行結果から、equalsIgnoreCaseメソッドで大文字と小文字を区別せずに文字列の比較ができることが確認できました!
equalsIgnoreCaseで大文字と小文字を区別せずに比較する方法についてはこちらで詳しく解説しているので、ぜひ確認してください!
equalsメソッドで否定の判定をする方法
ここではequalsメソッドで2つの文字列が等しい場合に”false”を返す否定の判定をする方法を解説します。
equalsメソッドは2つの文字列を比較して、それが等しい場合に”true”を返しますが、等しい場合に”false”を返す処理をしたいときには否定の論理演算子”!”を使います。
次のプログラムで使い方を確認してみましょう。
public class Main { public static void main(String[] args) { String str1 = "abc"; String str2 = "abc"; System.out.println("[equalsで比較]"); System.out.println(str1.equals(str2)); System.out.println("[否定の論理演算子”!”を使用]"); System.out.println(!str1.equals(str2)); } }
実行結果
[equalsで比較] true [否定の論理演算子”!”を使用] false
このプログラムではequalsメソッドで文字列を比較した結果と、その結果を否定の論理演算子”!”で反転させた結果をそれぞれ表示しています。
このプログラムの実行結果から、否定の論理演算子”!”で比較の結果を反転できることが確認できました!
equalsメソッドで否定の判定をする方法についてはこちらで詳しく解説しているので、ぜひ確認してください!
Objectsクラスのequalsメソッドの使い方
ここではObjectsクラスのequalsメソッドを使って、nullPointerExceptionの例外を発生させずにnullを安全に比較する方法を解説します。
Stringクラスのequalsメソッドでは、メソッドの呼び出し元のオブジェクトがnullの場合にnullPointerExceptionの例外が発生します。
Java7で追加された、java.util.Objectsクラスのequalsメソッドを使えばオブジェクトがnullの場合でも例外を発生させずに安全に比較をすることができます。
Objectsクラスのequalsメソッドを使うには、次のインポート文が必要です。
import java.util.Objects;
Objectsクラスのequalsメソッドの使い方を、次のプログラムで確認してみましょう。
import java.util.Objects; public class Main { public static void main(String[] args) { String str1 = null; String str2 = "abc"; String str3 = null; System.out.println(Objects.equals(str1, str2)); System.out.println(Objects.equals(str1, str3)); } }
実行結果
false true
このプログラムではObjectsクラスのequalsメソッドでnullと文字列を比較した結果を表示しています。
また、null同士を比較した場合には”true”を返すことが確認できます。
このプログラムの実行結果から、nullの可能性がある文字列を安全に比較できることが確認できました!
Objectsクラスのequalsメソッドでnullを安全に比較する方法についてはこちらで詳しく解説しているので、ぜひ確認してください!
2つのListを比較してデータを抽出する方法
最後にequalsメソッドの実践的な使い方として、2つのListを比較して一致するデータを抽出する方法を解説します。
2重ループを使ったシンプルな方法で、2つのListから一致する文字を抽出して新しいListに追加する方法を次のプログラムで確認してみましょう。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main { public static void main(String[] args) { List<String> listA = new ArrayList<String>(Arrays.asList("s", "a", "m", "u", "r", "a", "i")); List<String> listB = new ArrayList<String>(Arrays.asList("e", "n", "g", "i", "n", "e", "e", "r")); List<String> listC = new ArrayList<String>(); System.out.println("before"); System.out.println("ListA = " + listA); System.out.println("ListB = " + listB); System.out.println("ListC = " + listC); for (String a : listA) { for (String b : listB) { if (a.equals(b)) { listC.add(a); break; } } } System.out.println("after"); System.out.println("ListA = " + listA); System.out.println("ListB = " + listB); System.out.println("ListC = " + listC); } }
実行結果
before ListA = [s, a, m, u, r, a, i] ListB = [e, n, g, i, n, e, e, r] ListC = [] after ListA = [s, a, m, u, r, a, i] ListB = [e, n, g, i, n, e, e, r] ListC = [r, i]
このプログラムでは、2重ループとequalsメソッドを使ってListAの文字とListBの文字が同じ場合にListCに文字を追加しています。
2つのListを比較してデータを抽出する方法についてはこちらで詳しく解説しているので、ぜひ確認してください!
まとめ
いかがでしたか?
今回はequalsメソッドの使い方について解説しました。
equalsメソッドはnullの場合の例外に注意する必要がありますが、Objectsクラスのequalsメソッドならnullを安全に比較できるのでぜひ覚えてくださいね。
もし、equalsメソッドを使う方法を忘れてしまったらこの記事を確認してください!