はじめに
この実験では、Java で文字列を効果的に比較する方法を学びます。文字列の比較を理解することは、様々なプログラミングタスクにとって基本的です。メモリ内で異なるオブジェクトであっても、2 つの文字列が同じ文字シーケンスを持っているかどうかをチェックする標準的な equals() メソッドを探ります。
さらに、null である可能性のある文字列を比較する際に発生する潜在的な NullPointerException の問題を処理する方法を学びます。最後に、文字の大文字小文字が比較ロジックに影響しない場合に柔軟性を提供する、大文字小文字を区別しない文字列比較を行う equalsIgnoreCase() メソッドについて説明します。
equals() メソッドを使用して文字列を比較する
このステップでは、Java で equals() メソッドを使用して文字列を比較する方法を学びます。文字列の比較はプログラミングにおける基本的な操作であり、正しく行う方法を理解することは重要です。
Java では、文字列はオブジェクトであり、整数やブール値のようなプリミティブデータ型ではありません。これは、文字列を比較するときに、単に値を比較するのではなく、オブジェクト自体を比較することを意味します。== 演算子を使用して文字列を比較すると、2 つの文字列変数がメモリ内の 同じ オブジェクトを参照しているかどうかがチェックされます。しかし、多くの場合、2 つの文字列が 同じ文字シーケンス を持っているかどうかをチェックしたいと思うでしょう。この場合は、equals() メソッドを使用する必要があります。
これを実証するために、簡単な Java プログラムを作成しましょう。
WebIDE エディタで
HelloJava.javaファイルが開いていない場合は、開きます。ファイルの内容全体を次のコードに置き換えます。
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 つの文字列変数
str1、str2、str3を宣言しています。 str1とstr2は文字列リテラルを使用して作成されています。Java はしばしば文字列リテラルを最適化して、同一のリテラルが同じオブジェクトを参照するようにします。str3はnew String()コンストラクタを使用して作成されています。これにより、内容が既存のリテラルと同じであっても、メモリ内に新しい文字列オブジェクトが明示的に作成されます。equals()を使用して文字列の内容を比較しています。==を使用して、文字列変数が同じオブジェクトを参照しているかどうかを比較しています。
- 3 つの文字列変数
ファイルを保存します(Ctrl+S または Cmd+S)。
次に、プログラムをコンパイルしましょう。WebIDE の下部にあるターミナルを開き、
~/projectディレクトリにいることを確認します。次のコマンドを実行します。javac StringComparison.javaコンパイルが成功すると、何も出力されません。
~/projectディレクトリにStringComparison.classファイルが作成されます。最後に、
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 ==: falsestr1.equals(str2)とstr1.equals(str3)はどちらもtrueを返します。これは、文字列の内容が同じであるためです。しかし、str1 == str3はfalseを返します。これは、str1とstr3がメモリ内の異なる文字列オブジェクトを参照しているためです。ただし、この特定のケースではstr1 == str2がtrueを返します。これは文字列リテラルの最適化によるものです。ただし、一般的には==を文字列の比較に使用することは推奨されません。なぜなら、予期しない結果をもたらす可能性があるからです。
これは、Java で文字列の内容を比較する正しい方法が equals() メソッドを使用することである理由を示しています。
等価性チェックで null 文字列を扱う
このステップでは、Java で等価性チェックを行う際に null 文字列をどのように扱うかを探ります。null 文字列とは、文字列変数が何のオブジェクトも参照していない状態を指します。null 変数に対してメソッドを呼び出そうとすると、NullPointerException が発生します。これは Java でよく見られるエラーです。
文字列を比較する際には、片方または両方の文字列が null である可能性を考慮することが重要です。null 文字列に対して equals() メソッドを呼び出すと、プログラムがクラッシュします。
前のプログラムを修正して、これがどのように動作するか、そして安全に扱う方法を見てみましょう。
WebIDE エディタで
StringComparison.javaファイルを開きます。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)のようにです。
ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルで修正後のプログラムをコンパイルします。
javac StringComparison.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 Comparing str1 and str4 safely: false Comparing str4 and str1 safely: false Comparing str4 and null safely: trueこの出力は、安全な比較が
null文字列をエラーを引き起こすことなく正しく扱っていることを示しています。str1とstr4(nullである)の比較は正しくfalseと評価されています。
このステップでは、Java でオブジェクト、特に文字列とやり取りする際に null 値を適切に扱うことの重要性を強調しています。これにより、NullPointerException エラーを防ぐことができます。
大文字小文字を区別しない比較に equalsIgnoreCase() を使用する
この最後のステップでは、equalsIgnoreCase() メソッドについて学びます。このメソッドは、文字の大文字小文字を考慮せずに文字列を比較するために使用されます。文字が大文字か小文字かに関係なく、2 つの文字列が同じかどうかをチェックしたい場合に非常に便利です。
前のステップで使用した equals() メソッドは、大文字小文字を区別した比較を行います。つまり、equals() を使用すると、"hello" と "Hello" は等しくないと判断されます。一方、equalsIgnoreCase() メソッドは大文字小文字を無視するため、"hello" と "Hello" は等しいとみなされます。
equalsIgnoreCase() を実証するために、プログラムを最後に一度修正しましょう。
WebIDE エディタで
StringComparison.javaファイルを開きます。大文字小文字が異なる新しい文字列変数を追加し、
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 } }更新後のコードでは、以下のことを行っています。
- 大文字小文字が異なる
str5とstr6を追加しました。 equals()とequalsIgnoreCase()の違いを実証するための新しい出力文を追加しました。equals()と同様に、非null文字列に対してnull引数でequalsIgnoreCase()を呼び出してもエラーは発生しないことを示しています。ただし、null文字列変数に対してequalsIgnoreCase()を呼び出すと、依然としてNullPointerExceptionが発生します。
- 大文字小文字が異なる
ファイルを保存します(Ctrl+S または Cmd+S)。
ターミナルでプログラムをコンパイルします。
javac StringComparison.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 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() メソッドを使用して大文字小文字を区別しない文字列の比較を行う方法を学びました。



