Javaで文字列を効率的に扱う際によく使われるStringBuilderクラス。
しかし、StringBuilderで値の比較をする方法について迷ったことはありませんか?
本記事では、equals()メソッドの使い方やStringクラスとの違いを詳しく解説します。
初心者でも分かりやすく、例を交えて解説しているので、ぜひ参考にしてください!
はじめに
以前記事では「JavaでStringを比較するならequals!使い方と==演算子との違いをわかりやすく解説」というテーマの中で、参照型のデータであるStringクラスについて触れました。参照型においては、値の比較をする際は==演算子ではなく、equalsメソッドで比較をする必要がありましたね。

このString型とよく似たものでJavaにはStringBuilderというクラスがあります。このStringBuilderクラスでもequalsメソッドで比較をすることができるのでしょうか?
本記事ではJava初学者向けに下記の内容を中心に徹底解説!
- JavaのStringBuilderはどんなクラス?
- StringBuilderの基本的な使い方は?
- StringBuilderではequalsメソッドで値の比較はできる?
JavaのStringBuilderとは?
JavaのStringBuilderクラスは「文字列」を「mutable:ミュータブル(可変)」に扱うクラスです。インスタンス化するとデフォルトで16文字分の容量を持ちます。
以下の例ではStringBuilderクラスのappendメソッドで文字列を追加しています。(デフォルトの16文字分の容量+追加分の文字分の容量となる)
// StringBuilderのオブジェクトとして初期化
StringBuilder sb = new StringBuilder();
// append()メソッドで文字列を追加
sb.append("Java ");
sb.append("学習中");
// 出力結果:「Java 学習中」
System.out.println(sb.toString()); // toStringメソッドでString型に変換
また、「メソッドチェーン」といって、下記のようにメソッドを連ねていくことができるのが大きな特徴です。
// メソッドチェーンでappend
sb.append("Java ")
.append("学習中");
JavaのStringBuilderでequalsを使う方法と注意点
JavaのStringBulderではequals()メソッドを使うことはできます。
ただし、equals()メソッドで文字列の内容を比較するには、まずStringBuilderオブジェクトをtoString()メソッドでString型に変換する必要があります。
// 異なる2つのStringBuilderオブジェクトを生成
StringBuilder sb1 = new StringBuilder();
StringBuilder sb2 = new StringBuilder();
// 互いに同じ文字列をappend
sb1.append("Hello");
sb2.append("Hello");
// 判定結果:「true」
System.out.println(sb1.toString().equals(sb2.toString())); // toStringメソッドでString型に変換
下記のように「toString()メソッド」でString型に変換せず単にequals比較すると判定は「false」になります。
// 判定結果:「false」
// ※toStringメソッドでString型に変換せずにequalsで比較
System.out.println(sb1.equals(sb2));
これは、StringBuilderクラスがequals()メソッドを独自に実装(オーバーライド)していないため、Objectクラスのequals()メソッドが使われているからです。
なお、Objectクラスのequals()メソッドは内容の比較ではなく、参照先の一致を判定します。
このため、StringBulder型でのequals比較ではなく、String型に変換して値の比較をする必要があります。

よくある質問(FAQ)
String型とStringBuilder型はどう違うのですか?
先に述べたように、StringBuilderクラスは「文字列」を「mutable:ミュータブル(可変)」に扱うクラスです。
一方、Stringクラスは「文字列」を「imutable:イミュータブル(不可変)」に扱います。


図のように、Stringはイミュータブル(不可変)なので、再代入時に新しいオブジェクトが生成されます。
そのため、何度もStringの再代入が行われると、たくさんのオブジェクトが生成され、その分メモリの容量を多く消費することになります。
一方、StringBuilderクラスでは、append()メソッドなどを使って値を直接書き換えるため、新しいオブジェクトが生成されることがなく、結果的にメモリを節約できます。
おわりに
- StringBuilderクラスは「文字列」を「mutable(可変)」として扱うクラスです。そのため、値を直接書き換えることができ、appendメソッドなどを使用しても新しいオブジェクトが生成されません。これにより、Stringクラスと比べてメモリを効率的に使用できます。
- StringBuilderでequals()メソッドを使って内容を比較するには、toString()メソッドを使ってString型に変換する必要があります。