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

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

【Java Silver対策】StringとStringBuilderの罠 equals()の違いを解説

🟢 はじめに

Javaの学習を進めていると、誰もが一度は「あれ?なんでこの比較、falseになるの?」と疑問に思う瞬間があると思います。

今回は、Java Silverの試験でもよく狙われると言われている「String と StringBuilder の equals() メソッドの違い」について、例え話を交えながら解説します。


🚨 まずはこのコードを見てみましょう

以下のコードを実行したとき、どのような結果になるか予想できますか?

中身はどちらも「勇者」という文字列です。

public class Main {
    public static void main(String[] args) {
        // ① Stringの比較
        String s1 = "勇者";
        String s2 = new String("勇者");
        
        System.out.println("--- Stringの比較 ---");
        System.out.println(s1.equals(s2)); 

        // ② StringBuilderの比較
        StringBuilder sb1 = new StringBuilder("勇者");
        StringBuilder sb2 = new StringBuilder("勇者");
        
        System.out.println("--- StringBuilderの比較 ---");
        System.out.println(sb1.equals(sb2)); 
    }
}

🎯 実行結果

--- Stringの比較 ---
TRUE
--- StringBuilderの比較 ---
FALSE

「えっ!? StringBuilder の方は、中身が同じ『勇者』なのに false になっちゃうの!?」と驚いた方も多いのではないでしょうか?

実はここが、Java初心者がつまずきやすいポイントだと言われています。


📖 「本」と「ホワイトボード」

なぜこのような違いが生まれるのでしょうか?

それぞれのクラスを「印刷された本(String)」と「会議室のホワイトボード(StringBuilder)」に例えてみます。


📕 String の equals() は「物語(中身)」をチェックする

String は、一度作ったら中身を書き換えられない「印刷された本」のようなものです。

String の .equals() メソッドは、とても親切に作られていて、「違う出版社(違うメモリの場所)の本でも、書いてある物語(文字列)が同じなら同じと見なすよ!」というルールになっています。

だから、中身が同じ「勇者」であれば true を返してくれます。


📋 StringBuilder の equals() は「物理的なモノ」をチェックする

一方、StringBuilder は、何度も文字を書き消しできる「会議室のホワイトボード」です。

実は、StringBuilder クラスには、中身の文字を比較するための専用の .equals() が用意されていません(親クラスの機能をそのまま使っています)。

そのため、「ボードに書かれている文字(勇者)は関係ない!今目の前にあるホワイトボードと、隣の部屋にあるホワイトボードは『物理的に別のモノ』だから違う!」と判断してしまい、false になってしまうのです。


🛠️ じゃあ、StringBuilderの中身を比較するには?

「それじゃあ、StringBuilder の中身が同じかどうか確かめたい時はどうすればいいの?」と思いますよね。

解決策はとてもシンプルです。

一度 String に変換してから比較すればOKです!

StringBuilder sb1 = new StringBuilder("勇者");
StringBuilder sb2 = new StringBuilder("勇者");

// toString() を使って、String(文字列)に変換してから比較する。
boolean result = sb1.toString().equals(sb2.toString());

System.out.println(result); // 👉 結果:true になる!

.toString() メソッドを使うことで、「ホワイトボードに書かれた文字を、紙(String)に書き写す」ことができます。

紙にしてしまえば、先ほどの String の親切な .equals() が使えるようになります。


✍️ まとめ

String の .equals()
👉 「中身の文字」が同じなら true(物語を読む)

StringBuilder の .equals()
👉 中身は見てくれない! 全く同じオブジェクト(入れ物)じゃないと false(物理的なモノを見る)

対策
👉 StringBuilder の中身を比較したい時は、.toString() で String に変換してから .equals() を使う。

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


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

kenichikamoi.com


☕️ 息抜き・作業用BGMにどうぞ

趣味で生成AI(Suno)を使ったDTM作曲もしています。

www.youtube.com