0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Java Silver対策】同じ文字なのにfalse!? StringBuilderの罠

0
Posted at

🟢 はじめに

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. StringBuilderequals() = 「同じ箱かどうか?」📦

StringBuilder の equals() は、中身の文字ではなく 「全く同じ箱オブジェクトかどうか」 をチェックする、というルールを持っています。

例えるなら、nameBox1nameBox2別々の段ボール箱です。

  • 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)」 と、私たちが期待した通りの返事をしてくれます。

💡 まとめ:鉄則を覚えよう!

今回のポイントをまとめると、こうなります。

  • 📦 StringBuilderequals()オブジェクト)」そのものが同じかをチェックする

  • 🍎 Stringequals()中身文字列)」が同じかをチェックする

  • StringBuilderの中身の文字を比べたい時は、必ず一度 toString()String に変換してから equals() を使うこと

「同じ文字なのにfalseになる理由が分からない😵‍💫」と同じように悩んでいる方の参考になれば幸いです🙌

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?