🟢 はじめに
Javaの勉強をしていると、「あれ?同じ文字を入れたはずなのに、どうして結果が false(違う)になるの!?」と疑問に思ったこと、ありませんか?🤔
実はこれ、Java初心者が必ず一度は引っかかる 「StringBuilderの落とし穴」 だと言われています。
今回は、この不思議な現象の理由と、正しい比較方法を「箱と中身」の例え話を使ってスッキリ解説します!
💻 まずは謎のコードを見てみよう
まずは、こちらのコードを見てください。
どちらも「Java太郎」という同じ文字を作って、比較しているコードです。
public class StringCompareExample {
public static void main(String[] args) {
// 別々のStringBuilderを作って、同じ名前を入れる
StringBuilder nameBox1 = new StringBuilder("Java太郎");
StringBuilder nameBox2 = new StringBuilder("Java太郎");
// ① StringBuilderのままで比較してみる
System.out.println("箱の比較: " + nameBox1.equals(nameBox2));
// String(文字列)に変換する
String name1 = nameBox1.toString();
String name2 = nameBox2.toString();
// ② Stringに変換してから比較してみる
System.out.println("中身の比較: " + name1.equals(name2));
}
}
【実行結果】
箱の比較: false
中身の比較: true
同じ「Java太郎」なのに、①は false、②は true になりました!
いったいなぜ、こんな違いが生まれるのでしょうか?
📖 「箱そのもの」か「中身の文字」か
この謎を解くカギは、equals() メソッドが「何を基準に同じと判断しているか」 というルールの違いにあります。
1. StringBuilder の equals() = 「同じ箱かどうか?」📦
StringBuilder の equals() は、中身の文字ではなく 「全く同じ箱(オブジェクト)かどうか」 をチェックする、というルールを持っています。
例えるなら、nameBox1 と nameBox2 は別々の段ボール箱です。
-
nameBox1= 「Java太郎」と書かれた紙が入っている Aの箱 📦 -
nameBox2= 「Java太郎」と書かれた紙が入っている Bの箱 📦
Javaさんに「この2つは同じ?(equals)」と聞くと……
「中身は同じ『Java太郎』だけど、Aの箱とBの箱で『別々の箱』だから違うよ!(false)」 と答えてしまいます。
2. String の equals() = 「中身が同じかどうか?」
一方、私たちがよく使う String クラスの equals() は、とても親切です。
箱が別々でも 「書かれている文字(中身)が全く同じかどうか」 をしっかりチェックしてくれます。
コードの中で使っている toString() というメソッドは、箱の中から「文字だけ」を取り出してコピーしてくれる役割があります。
-
name1= Aの箱から取り出した 「Java太郎」という文字 📝 -
name2= Bの箱から取り出した 「Java太郎」という文字 📝
Javaさんに「この2つは同じ?(equals)」と聞くと……
「どちらも『Java太郎』という全く同じ文字だから、同じだよ!(true)」 と、私たちが期待した通りの返事をしてくれます。
💡 まとめ:鉄則を覚えよう!
今回のポイントをまとめると、こうなります。
-
📦
StringBuilderのequals()「箱(オブジェクト)」そのものが同じかをチェックする -
🍎
Stringのequals()「中身(文字列)」が同じかをチェックする -
StringBuilderの中身の文字を比べたい時は、必ず一度toString()でStringに変換してからequals()を使うこと
「同じ文字なのにfalseになる理由が分からない😵💫」と同じように悩んでいる方の参考になれば幸いです🙌