Java の文字列の比較「equals()」と「==」の違いとは?
新人
「Java で文字列を比較する方法はありますか?」
先輩
「Java では、equals() メソッドと == 演算子の両方を使って文字列を比較できるよ。」
新人
「どっちも同じように使えるんですか?」
先輩
「実はそれぞれ違った意味を持っているんだ。それぞれの違いを詳しく見てみよう!」
1. 文字列の比較とは?(基本的な説明)
Java では、文字列を比較するために equals() メソッドと == 演算子の 2 つの方法があります。
文字列比較の基本
equals()メソッド … 文字列の「内容」が同じかどうかを比較==演算子 … オブジェクトの「参照」が同じかどうかを比較
例えば、同じ内容の文字列を作成して比較したとき、使う方法によって結果が異なることがあります。
2. 「==」演算子での文字列の比較
== 演算子を使うと、文字列オブジェクトの「参照」が同じかどうかを比較します。
== 演算子を使った比較の例
public class StringComparison {
public static void main(String[] args) {
String str1 = "Java";
String str2 = "Java";
String str3 = new String("Java");
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
}
}
true
false
コードの解説
String str1 = "Java";とString str2 = "Java";… 同じ文字列リテラルを代入- Java の文字列リテラルはメモリ上の「文字列プール」に保存されるため、
str1とstr2は同じ参照を持つ String str3 = new String("Java");…newを使って新しいインスタンスを作成str1 == str3はfalseになる …str1とstr3は異なるオブジェクトを指している
このように、== 演算子は文字列の内容ではなく、オブジェクトの参照が同じかどうかを比較するため、思わぬ結果になることがあります。
3. 「equals()」メソッドでの文字列の比較
equals() メソッドを使うと、文字列の「内容」が同じかどうかを比較できます。
equals() メソッドを使った比較の例
public class StringEqualsExample {
public static void main(String[] args) {
String str1 = "Java";
String str2 = "Java";
String str3 = new String("Java");
System.out.println(str1.equals(str2)); // true
System.out.println(str1.equals(str3)); // true
}
}
true
true
コードの解説
str1.equals(str2)はtrue… 文字列の内容が同じだからstr1.equals(str3)もtrue…equals()メソッドはオブジェクトの「内容」を比較する
このように、equals() メソッドを使えば、異なるオブジェクトでも内容が同じであれば true になります。
4. 「==」と「equals()」の違い
ここまで見てきたように、== 演算子と equals() メソッドでは、比較する対象が異なります。
「==」と「equals()」の比較表
| 比較方法 | 比較対象 | 結果 |
|---|---|---|
== 演算子 |
オブジェクトの参照 | 同じオブジェクトなら true |
equals() メソッド |
文字列の内容 | 内容が同じなら true |
実際に、== と equals() を並べて比較してみましょう。
public class StringComparisonTest {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = new String("Hello");
System.out.println("== で比較: " + (str1 == str2)); // false
System.out.println("equals() で比較: " + str1.equals(str2)); // true
}
}
== で比較: false
equals() で比較: true
コードの解説
str1 == str2はfalse…newを使って作成したstr2は別のオブジェクトstr1.equals(str2)はtrue… 内容は同じだから
このように、== はオブジェクトの「参照」を比較し、equals() は「内容」を比較する違いがあります。
5. どちらを使うべきか?
文字列の比較では、基本的に equals() メソッドを使うべきです。
なぜ equals() を使うべきなのか?
- 文字列の「内容」を正しく比較できる
new String()を使って作成したオブジェクトでも問題なく比較できる- Java の標準的な文字列比較方法
例えば、文字列を変数に代入し、比較する場合に == と equals() を使った場合の違いを見てみましょう。
文字列比較の具体例
public class StringComparisonExample {
public static void main(String[] args) {
String correctAnswer = "Java";
String input1 = "Java";
String input2 = new String("Java");
if (input1 == correctAnswer) {
System.out.println("== を使った比較: 一致しました");
} else {
System.out.println("== を使った比較: 一致しませんでした");
}
if (input1.equals(correctAnswer)) {
System.out.println("equals() を使った比較: 一致しました");
} else {
System.out.println("equals() を使った比較: 一致しませんでした");
}
if (input2 == correctAnswer) {
System.out.println("== を使った比較 (new String 使用): 一致しました");
} else {
System.out.println("== を使った比較 (new String 使用): 一致しませんでした");
}
if (input2.equals(correctAnswer)) {
System.out.println("equals() を使った比較 (new String 使用): 一致しました");
} else {
System.out.println("equals() を使った比較 (new String 使用): 一致しませんでした");
}
}
}
== を使った比較: 一致しました
equals() を使った比較: 一致しました
== を使った比較 (new String 使用): 一致しませんでした
equals() を使った比較 (new String 使用): 一致しました
コードの解説
input1 == correctAnswerはtrue… 文字列リテラルは同じメモリを参照するためinput1.equals(correctAnswer)はtrue… 内容が同じなので正しく比較されるinput2 == correctAnswerはfalse…new String()を使ったため異なるオブジェクトを指すinput2.equals(correctAnswer)はtrue… 内容が同じなので正しく比較される
このように、== では new String() を使うと比較に失敗する可能性があります。文字列の比較には常に equals() を使いましょう。
6. 文字列比較の実践的な活用例
文字列を比較する場面は多くあります。たとえば、ユーザーの入力チェックや、データの検索などが挙げられます。
1. 配列の中から特定の文字列を探す
文字列のリストから特定の値を探す場合、equals() を使うことで正しく比較できます。
public class StringSearchExample {
public static void main(String[] args) {
String[] languages = {"Java", "Python", "C++", "JavaScript"};
String target = "Java";
boolean found = false;
for (String lang : languages) {
if (lang.equals(target)) {
found = true;
break;
}
}
if (found) {
System.out.println("指定した言語が見つかりました!");
} else {
System.out.println("指定した言語はリストにありません。");
}
}
}
指定した言語が見つかりました!
このように、equals() を使うことで、文字列の内容が一致しているかどうかを判定できます。
2. ユーザーIDのチェック
システムにログインする際に、ユーザーIDが正しいかどうかを判定することもあります。
public class UserCheckExample {
public static void main(String[] args) {
String storedUserId = "user123";
String inputUserId = "user123";
if (inputUserId.equals(storedUserId)) {
System.out.println("ユーザー認証成功!");
} else {
System.out.println("ユーザーIDが間違っています。");
}
}
}
ユーザー認証成功!
このように、ログイン処理でもequals() を活用することができます。
7. equalsIgnoreCase() の使い方
equalsIgnoreCase() メソッドを使うと、大文字と小文字を区別せずに比較できます。
equalsIgnoreCase() の基本的な使い方
public class StringIgnoreCaseExample {
public static void main(String[] args) {
String str1 = "Java";
String str2 = "java";
if (str1.equalsIgnoreCase(str2)) {
System.out.println("大文字・小文字を無視して一致しました!");
} else {
System.out.println("一致しませんでした。");
}
}
}
大文字・小文字を無視して一致しました!
equalsIgnoreCase() の活用例
たとえば、ユーザーの入力をチェックする際に、大文字と小文字を区別せずに比較する場面で使えます。
public class LoginCheckExample {
public static void main(String[] args) {
String correctPassword = "Password123";
String inputPassword = "password123";
if (correctPassword.equalsIgnoreCase(inputPassword)) {
System.out.println("パスワードが正しく入力されました!");
} else {
System.out.println("パスワードが間違っています。");
}
}
}
パスワードが正しく入力されました!
このように、パスワードなどの比較を行う際に equalsIgnoreCase() を使うと、大文字・小文字の違いによる入力ミスを防ぐことができます。
8. 練習問題:「equals()」と「==」を正しく使うプログラムを作ろう
ここまで学んだ内容を実践するために、練習問題に挑戦してみましょう。
問題: 文字列の比較を正しく行うプログラムを作成
以下の条件を満たすプログラムを作成してください。
- 変数
word1とword2に同じ文字列を格納 - 変数
word3にnew String()を使って同じ文字列を作成 ==とequals()の両方を使って比較し、それぞれの結果を出力する
解答例
public class StringComparisonPractice {
public static void main(String[] args) {
String word1 = "Hello";
String word2 = "Hello";
String word3 = new String("Hello");
System.out.println("word1 == word2: " + (word1 == word2)); // true
System.out.println("word1.equals(word2): " + word1.equals(word2)); // true
System.out.println("word1 == word3: " + (word1 == word3)); // false
System.out.println("word1.equals(word3): " + word1.equals(word3)); // true
}
}
word1 == word2: true
word1.equals(word2): true
word1 == word3: false
word1.equals(word3): true
解説
word1 == word2はtrue… 同じリテラルを使用しているためword1.equals(word2)はtrue… 文字列の内容が同じword1 == word3はfalse…new String()を使ったため異なるオブジェクトword1.equals(word3)はtrue… 内容が同じなので比較結果はtrue
このように、文字列の比較では equals() を使うことで正しく判定できます。