カテゴリ: Javaの文字列操作 更新日: 2025/04/14

Java の文字列の比較「equals()」と「==」の違いとは?

087
Java の文字列の比較「equals()」と「==」の違いとは?

新人と先輩の会話形式で理解しよう

新人

「Java で文字列を比較する方法はありますか?」

先輩

「Java では、equals() メソッドと == 演算子の両方を使って文字列を比較できるよ。」

新人

「どっちも同じように使えるんですか?」

先輩

「実はそれぞれ違った意味を持っているんだ。それぞれの違いを詳しく見てみよう!」

1. 文字列の比較とは?(基本的な説明)

1. 文字列の比較とは?(基本的な説明)
1. 文字列の比較とは?(基本的な説明)

Java では、文字列を比較するために equals() メソッドと == 演算子の 2 つの方法があります。

文字列比較の基本

  • equals() メソッド … 文字列の「内容」が同じかどうかを比較
  • == 演算子 … オブジェクトの「参照」が同じかどうかを比較

例えば、同じ内容の文字列を作成して比較したとき、使う方法によって結果が異なることがあります。

2. 「==」演算子での文字列の比較

2. 「==」演算子での文字列の比較
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 の文字列リテラルはメモリ上の「文字列プール」に保存されるため、str1str2 は同じ参照を持つ
  • String str3 = new String("Java");new を使って新しいインスタンスを作成
  • str1 == str3false になる … str1str3 は異なるオブジェクトを指している

このように、== 演算子は文字列の内容ではなく、オブジェクトの参照が同じかどうかを比較するため、思わぬ結果になることがあります。

3. 「equals()」メソッドでの文字列の比較

3. 「equals()」メソッドでの文字列の比較
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)trueequals() メソッドはオブジェクトの「内容」を比較する

このように、equals() メソッドを使えば、異なるオブジェクトでも内容が同じであれば true になります。

Javaをこれから始める人や、 オブジェクト指向の考え方を基礎から理解したい人には、 定番の入門書がこちらです。

スッキリわかるJava入門 第4版をAmazonで見る

※ Amazon広告リンク

4. 「==」と「equals()」の違い

4. 「==」と「equals()」の違い
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 == str2falsenew を使って作成した str2 は別のオブジェクト
  • str1.equals(str2)true … 内容は同じだから

このように、== はオブジェクトの「参照」を比較し、equals() は「内容」を比較する違いがあります。

5. どちらを使うべきか?

5. どちらを使うべきか?
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 == correctAnswertrue … 文字列リテラルは同じメモリを参照するため
  • input1.equals(correctAnswer)true … 内容が同じなので正しく比較される
  • input2 == correctAnswerfalsenew String() を使ったため異なるオブジェクトを指す
  • input2.equals(correctAnswer)true … 内容が同じなので正しく比較される

このように、== では new String() を使うと比較に失敗する可能性があります。文字列の比較には常に equals() を使いましょう。

6. 文字列比較の実践的な活用例

6. 文字列比較の実践的な活用例
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() の使い方

7. equalsIgnoreCase() の使い方
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()」と「==」を正しく使うプログラムを作ろう

8. 練習問題:「equals()」と「==」を正しく使うプログラムを作ろう
8. 練習問題:「equals()」と「==」を正しく使うプログラムを作ろう

ここまで学んだ内容を実践するために、練習問題に挑戦してみましょう。

問題: 文字列の比較を正しく行うプログラムを作成

以下の条件を満たすプログラムを作成してください。

  • 変数 word1word2 に同じ文字列を格納
  • 変数 word3new 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 == word2true … 同じリテラルを使用しているため
  • word1.equals(word2)true … 文字列の内容が同じ
  • word1 == word3falsenew String() を使ったため異なるオブジェクト
  • word1.equals(word3)true … 内容が同じなので比較結果は true

このように、文字列の比較では equals() を使うことで正しく判定できます。

Javaの文字列操作の一覧へ
新着記事
FlutterのMVP・MVVMアーキテクチャの違いと使い分け
FlutterのMVP・MVVMアーキテクチャの違いと使い分けを初心者向けに解説!
オニオンアーキテクチャの基本とFlutterでの適用例
オニオンアーキテクチャの基本とFlutterでの適用例を初心者向けに解説
クリーンアーキテクチャとは?Flutterでの導入メリット
クリーンアーキテクチャとは?Flutterでの導入メリットをやさしく解説
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金まとめ
【AWS】RDS for Oracleの特徴・できないこと・バージョン・料金を初心者向けに徹底解説
人気記事
インスタンスタイプの料金比較と最適な選び方(最新2025年版)
AWSのインスタンスタイプの料金比較と最適な選び方【2025年最新版】
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCの料金体系まとめ!無料枠・通信費・各種サービスごとの料金を徹底解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】VPCエンドポイントとは?種類・使い方・S3連携まで完全解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説
【AWS】s3 cpコマンド完全ガイド!基本・recursive・exclude/includeも解説

🔌 USBポート不足を解消

Type-C 1本で拡張。
開発・作業環境を一気に快適に

UGREEN USB-Cハブを見る

※ Amazon広告リンク