public class 学習録 extends 【IT】 implements 【税務/会計】

UI/UXデザインやAWS構築で培った『ITスキル』を活かし、会計理論や税法のロジックを分かりやすくひも解く学習ノート

【Java Silver対策】Stringの比較で「==」を使ってはいけない理由

🟢 はじめに

今回は、Java Silverの学習中に引っかかりやすい罠、「String文字列の比較」について解説します!

実は、文字列を比べる時に == を使ってしまうと、思わぬバグを引き起こす原因になります。

RPGのゲームに例えながら、なぜダメなのか、どうすればいいのかを解説していきます。


🚪 合言葉で開く扉(サンプルコード)

まずは、こちらのコードを見てみてください。

まほうのカギ」という合言葉が合っていれば、扉が開くというシンプルなプログラムです。

public class StringCompareRPG {
    public static void main(String[] args) {
        // 王様から聞いた合言葉
        String passwordA = "まほうのカギ";
        
        // 道具屋で新しく買った巻物に書かれた合言葉
        String passwordB = new String("まほうのカギ");

        // 罠:== で比較してしまう
        if (passwordA == passwordB) {
            System.out.println("==の扉:開いた!🚪✨");
        } else {
            System.out.println("==の扉:開かない…🔒💦");
        }

        // 正解:.equals() で比較する
        if (passwordA.equals(passwordB)) {
            System.out.println(".equals()の扉:開いた!🚪✨");
        }
    }
}

パッと見ると、どちらも「まほうのカギ」という文字が入っているので、両方とも扉が開きそうですよね?

でも、これを実行すると……

実行結果

==の扉:開かない…🔒💦
.equals()の扉:開いた!🚪✨

なんと、== を使った扉は開きません!一体なぜでしょうか?


📦 罠の正体:== は「宝箱の場所」を見ている!

Javaの世界では、String文字列)は基本データ型ではなく「オブジェクト参照型)」という特別な扱いになります。

RPGで言うところの「宝箱オブジェクト)」の中に、文字の巻物が入っているイメージです。

== の働き(物理的な比較

== という記号は、「中身の文字」ではなく「まったく同じ宝箱メモリ上の場所かどうか」をチェックします。

今回のコードでは、new String(...) という魔法を使って、わざわざ新しい宝箱をもう一つ作っています。

そのため、中身の文字は同じでも「王様からもらった宝箱」と「道具屋で新しく買った宝箱」は物理的に別のモノだと判定され、扉が開かなかったのです。


📜 正解:中身の文字を読みたい時は .equals() を使う!

では、宝箱の中に入っている「合言葉の文字」だけを純粋に比べたい時はどうすればいいのでしょうか?

そこで登場するのが .equals() という魔法のコマンドです🪄

.equals() の働き(意味の比較)

これを使うと、「宝箱が別々のものであっても、中に入っている巻物の『文字』が同じならOK!」という条件になります。

私たちが日常的に「文字列を比較したい」と思う時は、100%こちらの意味ですよね。

だからこそ、文字列の比較には必ず .equals() を使う必要があります。


📝 まとめ

== は「同じ宝箱場所?」を比べるので、Stringには使わない!❌

.equals() は「中身の文字が同じか?」を比べるので、Stringにはこれを使う!⭕️

Java Silverの試験でも、この「わざと new String() を使って == で比較させる」という引っかけ問題が頻出すると言われています。

ぜひ、「文字列の比較は .equals()!」と、冒険の書に刻み込んでおきましょう!

Java学習中の方の参考になれば幸いです🙌


【プロフィール・作品置き場】

kenichikamoi.com


🎵 Youtube(楽曲一覧)はこちら

www.youtube.com