はじめに
Javaの学習中、「文字列の比較がうまくいかない」「==
で比較したのに合ってない」といった経験をしたことはありませんか?
文字列の比較は、Java初心者がよくつまずくポイントです。この記事では、Javaで文字列を比べる正しい方法とその違い・使い方を、わかりやすく丁寧に解説します。
1. 「==」と「equals()」の違いを知ろう
「==」は“同じものを見ているか”をチェック
Javaで==
を使うと、文字列の中身ではなく、参照先(メモリ上の場所)が同じかどうかを比較します。
1 |
String str1 = "Hello";<br>String str2 = "Hello";<br>System.out.println(str1 == str2); // true(同じリテラルを使っているため)<br><br>String str3 = new String("Hello");<br>System.out.println(str1 == str3); // false(newで新しく作られたため)<br> |
「equals()」は“中身の内容”を比較
文字列の内容が同じかどうかを比較する場合は、**equals()
**を使います。
1 |
System.out.println(str1.equals(str3)); // true(中身は同じ)<br> |
結論:
==
→ 参照先が同じか?equals()
→ 内容が同じか?
2. 大文字・小文字を無視して比較する:equalsIgnoreCase()
1 |
String a = "Java";<br>String b = "java";<br><br>System.out.println(a.equals(b)); // false<br>System.out.println(a.equalsIgnoreCase(b)); // true<br> |
このように、大文字・小文字を区別せずに比較したいときには、equalsIgnoreCase()
が便利です。
3. compareTo()で辞書順に比較する
compareTo()
は、文字列を**辞書順(アルファベット順)**で比較します。
1 |
System.out.println("Apple".compareTo("Banana")); // 負の値(Appleが先)<br>System.out.println("Banana".compareTo("Apple")); // 正の値<br>System.out.println("Apple".compareTo("Apple")); // 0(同じ)<br> |
数値の結果によって並び替えや判定が可能です。
4. null安全に比較する:Objects.equals()
null
と比較する場合、equals()
だとNullPointerException
が出る可能性があります。
1 |
String a = null;<br>String b = "test";<br><br>// System.out.println(a.equals(b)); // NPE発生<br>System.out.println(Objects.equals(a, b)); // false(安全)<br> |
Objects.equals()
を使えば、どちらかがnullでも安全に比較可能です。
5. 部分一致や正規表現を使った比較
startsWith()/endsWith()
1 |
String url = "https://example.com";<br><br>System.out.println(url.startsWith("https")); // true<br>System.out.println(url.endsWith(".com")); // true<br> |
matches():正規表現で一致判定
1 |
String email = "test@example.com";<br>System.out.println(email.matches(".*@.*\\.com")); // true<br> |
6. 間違いやすい比較パターンと注意点
リテラルとnewの違い
1 |
String a = "Java";<br>String b = new String("Java");<br><br>System.out.println(a == b); // false(newで別インスタンス)<br>System.out.println(a.equals(b)); // true<br> |
文字列プールとヒープの違いを理解する
リテラル文字列はJavaの「文字列プール」に格納され、==
でもtrueになることがありますが、newで生成した文字列はヒープに格納されるため、==
ではfalseになります。
7. 実践コード例まとめ
1 |
String a = "Hello";<br>String b = "Hello";<br>String c = new String("Hello");<br>String d = "hello";<br><br>// == 比較<br>System.out.println(a == b); // true<br>System.out.println(a == c); // false<br><br>// equals 比較<br>System.out.println(a.equals(c)); // true<br><br>// equalsIgnoreCase<br>System.out.println(a.equalsIgnoreCase(d)); // true<br><br>// compareTo<br>System.out.println(a.compareTo("World")); // 負の値<br><br>// null安全な比較<br>String e = null;<br>System.out.println(Objects.equals(e, a)); // false<br> |
8. 使い分けガイド
比較方法 | 使う場面 | 備考 |
---|---|---|
== | 文字列の参照(アドレス)が同じか? | 内容比較には不向き |
equals() | 文字列の内容が同じか? | 基本の比較方法 |
equalsIgnoreCase() | 大文字・小文字を無視したいとき | メールアドレスなど |
compareTo() | 辞書順を調べたいとき | ソート処理などに便利 |
Objects.equals() | nullが混じっているかも? | null安全な比較が可能 |
9. 学習の進め方とおすすめの次ステップ
文字列の比較は、プログラムを書くうえで毎日のように使います。ミスを減らすには、まずは正しい使い分けをしっかり覚えることが大切です。
そのためにまずは「絶対にJavaプログラマーになりたい人へ。」を読んで、基本をしっかり学びましょう。そして、実践的なコードレビューや転職支援を受けたい方は「サイゼントアカデミー」のサポートを活用するのが近道です!
まとめ
==
とequals()
は意味がまったく違う!- 中身を比べるなら
equals()
、nullが不安ならObjects.equals()
- 辞書順は
compareTo()
、大文字小文字無視はequalsIgnoreCase()
- 慣れていないうちは、常に「どの比較方法がふさわしいか」を意識しよう!
コメント