🟢 はじめに
今回は、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学習中の方の参考になれば幸いです🙌