
🟢 はじめに
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学習中の方の参考になれば幸いです🙌
【プロフィール・作品置き場】
☕️ 息抜き・作業用BGMにどうぞ
趣味で生成AI(Suno)を使ったDTM作曲もしています。