Java で文字列が別の文字列と等しいかどうかをチェックする方法

JavaJavaBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Java で文字列を効果的に比較する方法を学びます。文字列の比較を理解することは、様々なプログラミングタスクにとって基本的です。メモリ内で異なるオブジェクトであっても、2 つの文字列が同じ文字シーケンスを持っているかどうかをチェックする標準的な equals() メソッドを探ります。

さらに、null である可能性のある文字列を比較する際に発生する潜在的な NullPointerException の問題を処理する方法を学びます。最後に、文字の大文字小文字が比較ロジックに影響しない場合に柔軟性を提供する、大文字小文字を区別しない文字列比較を行う equalsIgnoreCase() メソッドについて説明します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/StringManipulationGroup -.-> java/strings("Strings") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/strings -.-> lab-559983{{"Java で文字列が別の文字列と等しいかどうかをチェックする方法"}} java/string_methods -.-> lab-559983{{"Java で文字列が別の文字列と等しいかどうかをチェックする方法"}} end

equals() メソッドを使用した文字列の比較

このステップでは、Java で equals() メソッドを使用して文字列を比較する方法を学びます。文字列の比較はプログラミングにおける基本的な操作であり、正しく行う方法を理解することは重要です。

Java では、文字列はオブジェクトであり、整数やブール値のようなプリミティブデータ型ではありません。これは、文字列を比較するときに、単に値を比較するのではなく、オブジェクト自体を比較することを意味します。== 演算子を使用して文字列を比較すると、2 つの文字列変数がメモリ内の 同じ オブジェクトを参照しているかどうかがチェックされます。しかし、多くの場合、2 つの文字列が 同じ文字シーケンス を持っているかどうかをチェックしたいと思うでしょう。この場合は、equals() メソッドを使用する必要があります。

これを実証するために、簡単な Java プログラムを作成しましょう。

  1. WebIDE エディタで HelloJava.java ファイルが開いていない場合は、開きます。

  2. ファイルの内容全体を次のコードに置き換えます。

    public class StringComparison {
        public static void main(String[] args) {
            String str1 = "hello";
            String str2 = "hello";
            String str3 = new String("hello");
    
            System.out.println("Comparing str1 and str2 using equals(): " + str1.equals(str2));
            System.out.println("Comparing str1 and str3 using equals(): " + str1.equals(str3));
            System.out.println("Comparing str1 and str2 using ==: " + (str1 == str2));
            System.out.println("Comparing str1 and str3 using ==: " + (str1 == str3));
        }
    }

    このコードでは、以下のことを行っています。

    • 3 つの文字列変数 str1str2str3 を宣言しています。
    • str1str2 は文字列リテラルを使用して作成されています。Java はしばしば文字列リテラルを最適化して、同一のリテラルが同じオブジェクトを参照するようにします。
    • str3new String() コンストラクタを使用して作成されています。これにより、内容が既存のリテラルと同じであっても、メモリ内に新しい文字列オブジェクトが明示的に作成されます。
    • equals() を使用して文字列の内容を比較しています。
    • == を使用して、文字列変数が同じオブジェクトを参照しているかどうかを比較しています。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. 次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、~/project ディレクトリにいることを確認します。次のコマンドを実行します。

    javac StringComparison.java

    コンパイルが成功すると、何も出力されません。~/project ディレクトリに StringComparison.class ファイルが作成されます。

  5. 最後に、java コマンドを使用してコンパイルされたプログラムを実行します。

    java StringComparison

    次のような出力が表示されるはずです。

    Comparing str1 and str2 using equals(): true
    Comparing str1 and str3 using equals(): true
    Comparing str1 and str2 using ==: true
    Comparing str1 and str3 using ==: false

    str1.equals(str2)str1.equals(str3) はどちらも true を返します。これは、文字列の内容が同じであるためです。しかし、str1 == str3false を返します。これは、str1str3 がメモリ内の異なる文字列オブジェクトを参照しているためです。ただし、この特定のケースでは str1 == str2true を返します。これは文字列リテラルの最適化によるものです。ただし、一般的には == を文字列の比較に使用することは推奨されません。なぜなら、予期しない結果をもたらす可能性があるからです。

これは、Java で文字列の内容を比較する正しい方法が equals() メソッドを使用することである理由を示しています。

等価性チェックにおける null 文字列の扱い

このステップでは、Java で等価性チェックを行う際に null 文字列をどのように扱うかを探ります。null 文字列とは、文字列変数が何のオブジェクトも参照していない状態を指します。null 変数に対してメソッドを呼び出そうとすると、NullPointerException が発生します。これは Java でよく見られるエラーです。

文字列を比較する際には、片方または両方の文字列が null である可能性を考慮することが重要です。null 文字列に対して equals() メソッドを呼び出すと、プログラムがクラッシュします。

前のプログラムを修正して、これがどのように動作するか、そして安全に扱う方法を見てみましょう。

  1. WebIDE エディタで StringComparison.java ファイルを開きます。

  2. main メソッドを修正して、null 文字列を含めます。

    public class StringComparison {
        public static void main(String[] args) {
            String str1 = "hello";
            String str2 = "hello";
            String str3 = new String("hello");
            String str4 = null; // This string is null
    
            System.out.println("Comparing str1 and str2 using equals(): " + str1.equals(str2));
            System.out.println("Comparing str1 and str3 using equals(): " + str1.equals(str3));
            System.out.println("Comparing str1 and str2 using ==: " + (str1 == str2));
            System.out.println("Comparing str1 and str3 using ==: " + (str1 == str3));
    
            // Let's try comparing with the null string
            // System.out.println("Comparing str1 and str4 using equals(): " + str1.equals(str4)); // This line would cause a NullPointerException
            // System.out.println("Comparing str4 and str1 using equals(): " + str4.equals(str1)); // This line would also cause a NullPointerException
    
            // Correct way to compare when one string might be null
            System.out.println("Comparing str1 and str4 safely: " + (str1 != null && str1.equals(str4)));
            System.out.println("Comparing str4 and str1 safely: " + (str4 != null && str4.equals(str1)));
            System.out.println("Comparing str4 and null safely: " + (str4 == null));
        }
    }

    修正後のコードでは、以下のことを行っています。

    • null 文字列 str4 を追加しました。
    • 実行すると NullPointerException を引き起こす行をコメントアウトしました。
    • 片方の文字列が null である可能性がある場合に、安全に文字列を比較する方法の例を追加しました。最も安全な方法は、equals() メソッドを呼び出す前に、そのメソッドを呼び出す文字列が null でないことをチェックすることです。一般的なパターンは (stringVariable != null && stringVariable.equals(anotherString)) です。また、可能であれば、既知の非 null 文字列に対して equals() を呼び出すこともできます。例えば "hello".equals(str4) のようにです。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルで修正後のプログラムをコンパイルします。

    javac StringComparison.java
  5. コンパイルされたプログラムを実行します。

    java StringComparison

    次のような出力が表示されるはずです。

    Comparing str1 and str2 using equals(): true
    Comparing str1 and str3 using equals(): true
    Comparing str1 and str2 using ==: true
    Comparing str1 and str3 using ==: false
    Comparing str1 and str4 safely: false
    Comparing str4 and str1 safely: false
    Comparing str4 and null safely: true

    この出力は、安全な比較が null 文字列をエラーを引き起こすことなく正しく扱っていることを示しています。str1str4null である)の比較は正しく false と評価されています。

このステップでは、Java でオブジェクト、特に文字列とやり取りする際に null 値を適切に扱うことの重要性を強調しています。これにより、NullPointerException エラーを防ぐことができます。

equalsIgnoreCase() を使用した大文字小文字を区別しない比較

この最後のステップでは、equalsIgnoreCase() メソッドについて学びます。このメソッドは、文字の大文字小文字を考慮せずに文字列を比較するために使用されます。文字が大文字か小文字かに関係なく、2 つの文字列が同じかどうかをチェックしたい場合に非常に便利です。

前のステップで使用した equals() メソッドは、大文字小文字を区別した比較を行います。つまり、equals() を使用すると、"hello" と "Hello" は等しくないと判断されます。一方、equalsIgnoreCase() メソッドは大文字小文字を無視するため、"hello" と "Hello" は等しいとみなされます。

equalsIgnoreCase() を実証するために、プログラムを最後に一度修正しましょう。

  1. WebIDE エディタで StringComparison.java ファイルを開きます。

  2. 大文字小文字が異なる新しい文字列変数を追加し、equalsIgnoreCase() を使用して比較します。

    public class StringComparison {
        public static void main(String[] args) {
            String str1 = "hello";
            String str2 = "hello";
            String str3 = new String("hello");
            String str4 = null;
            String str5 = "Hello"; // Different casing
            String str6 = "HELLO"; // All uppercase
    
            System.out.println("Comparing str1 and str2 using equals(): " + str1.equals(str2));
            System.out.println("Comparing str1 and str3 using equals(): " + str1.equals(str3));
            System.out.println("Comparing str1 and str2 using ==: " + (str1 == str2));
            System.out.println("Comparing str1 and str3 using ==: " + (str1 == str3));
    
            // Safe comparison with null
            System.out.println("Comparing str1 and str4 safely: " + (str1 != null && str1.equals(str4)));
            System.out.println("Comparing str4 and str1 safely: " + (str4 != null && str4.equals(str1)));
            System.out.println("Comparing str4 and null safely: " + (str4 == null));
    
            System.out.println("\n--- Case-Insensitive Comparisons ---");
            System.out.println("Comparing str1 and str5 using equals(): " + str1.equals(str5));
            System.out.println("Comparing str1 and str5 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str5));
            System.out.println("Comparing str1 and str6 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str6));
            System.out.println("Comparing str5 and str6 using equalsIgnoreCase(): " + str5.equalsIgnoreCase(str6));
    
            // equalsIgnoreCase() also handles null safely if called on a non-null string
            System.out.println("Comparing str1 and str4 using equalsIgnoreCase(): " + str1.equalsIgnoreCase(str4));
            // System.out.println("Comparing str4 and str1 using equalsIgnoreCase(): " + str4.equalsIgnoreCase(str1)); // This would still cause a NullPointerException
        }
    }

    更新後のコードでは、以下のことを行っています。

    • 大文字小文字が異なる str5str6 を追加しました。
    • equals()equalsIgnoreCase() の違いを実証するための新しい出力文を追加しました。
    • equals() と同様に、非 null 文字列に対して null 引数で equalsIgnoreCase() を呼び出してもエラーは発生しないことを示しています。ただし、null 文字列変数に対して equalsIgnoreCase() を呼び出すと、依然として NullPointerException が発生します。
  3. ファイルを保存します(Ctrl+S または Cmd+S)。

  4. ターミナルでプログラムをコンパイルします。

    javac StringComparison.java
  5. コンパイルされたプログラムを実行します。

    java StringComparison

    次のような出力が表示されるはずです。

    Comparing str1 and str2 using equals(): true
    Comparing str1 and str3 using equals(): true
    Comparing str1 and str2 using ==: true
    Comparing str1 and str3 using ==: false
    Comparing str1 and str4 safely: false
    Comparing str4 and str1 safely: false
    Comparing str4 and null safely: true
    
    --- Case-Insensitive Comparisons ---
    Comparing str1 and str5 using equals(): false
    Comparing str1 and str5 using equalsIgnoreCase(): true
    Comparing str1 and str6 using equalsIgnoreCase(): true
    Comparing str5 and str6 using equalsIgnoreCase(): true
    Comparing str1 and str4 using equalsIgnoreCase(): false

    この出力は、equalsIgnoreCase() が同じ文字で大文字小文字が異なる文字列を比較するときに true を返し、equals()false を返すことを明確に示しています。

これで、Java で equals() を使用して大文字小文字を区別した文字列の比較を行う方法、null 文字列を安全に扱う方法、および equalsIgnoreCase() を使用して大文字小文字を区別しない文字列の比較を行う方法を学びました。これらは Java で文字列を扱う上で不可欠なスキルです。

まとめ

この実験では、Java で文字列を比較する方法を学びました。まず、== 演算子を使用して文字列オブジェクトを比較することと、equals() メソッドを使用してその内容を比較することの違いを理解しました。== はオブジェクトの同一性をチェックし、equals() は文字シーケンスの等価性をチェックすることがわかりました。

次に、equals() を呼び出す文字列が null でないことを確認することで、文字列の比較時に潜在的な NullPointerException をどのように扱うかを探りました。最後に、equalsIgnoreCase() メソッドを使用して大文字小文字を区別しない文字列の比較を行う方法を学びました。