Java

JavaのStringBuilderでequalsメソッドを使う方法と注意点を解説

Javaで文字列を効率的に扱う際によく使われるStringBuilderクラス。
しかし、StringBuilderで値の比較をする方法について迷ったことはありませんか?
本記事では、equals()メソッドの使い方やStringクラスとの違いを詳しく解説します。
初心者でも分かりやすく、例を交えて解説しているので、ぜひ参考にしてください!

はじめに

以前記事では「JavaでStringを比較するならequals!使い方と==演算子との違いをわかりやすく解説」というテーマの中で、参照型のデータであるStringクラスについて触れました。参照型においては、値の比較をする際は==演算子ではなく、equalsメソッドで比較をする必要がありましたね。

JavaのString比較|equalsの使い方と==演算子との違いを徹底解説Javaで文字列(String)を正確に比較する方法を解説!equalsメソッドの使い方や==演算子との違い、注意点、実践例を分かりやすく紹介します。「Java String 比較 equals」に関する疑問を解決する完全ガイドです。...

このString型とよく似たものでJavaにはStringBuilderというクラスがあります。このStringBuilderクラスでもequalsメソッドで比較をすることができるのでしょうか?

本記事ではJava初学者向けに下記の内容を中心に徹底解説!

  • JavaのStringBuilderはどんなクラス?
  • StringBuilderの基本的な使い方は?
  • StringBuilderではequalsメソッドで値の比較はできる?
punpee-code
punpee-code
JavaのStringBuilderではどうやってequalsで比較するのかな?

JavaのStringBuilderとは?

JavaStringBuilderクラスは「文字列」「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を使う方法と注意点

JavaStringBulderでは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型に変換して値の比較をする必要があります。

stringbuilderでequalsをしたい場合の説明図です

よくある質問(FAQ)

String型とStringBuilder型はどう違うのですか?

先に述べたように、StringBuilderクラスは「文字列」「mutable:ミュータブル(可変)」に扱うクラスです。

一方、Stringクラスは「文字列」「imutable:イミュータブル(不可変)」に扱います。

Javaの基本データ型・参照型の違いを一覧表と図解付きで徹底解説Javaのデータ型を完全解説!基本データ型と参照型の違いや特徴を詳しく説明し、全データ型を一覧で整理しました。初心者にも分かりやすい内容で、Javaの基礎力を徹底強化!...
String型の再定義時に新たなオブジェクトが生成される説明図です

図のように、Stringイミュータブル(不可変)なので、再代入時に新しいオブジェクトが生成されます。

そのため、何度もStringの再代入が行われると、たくさんのオブジェクトが生成され、その分メモリの容量を多く消費することになります。

一方、StringBuilderクラスでは、append()メソッドなどを使って値を直接書き換えるため、新しいオブジェクトが生成されることがなく、結果的にメモリを節約できます。

おわりに

StringBulder
  • StringBuilderクラスは「文字列」を「mutable(可変)」として扱うクラスです。そのため、値を直接書き換えることができ、appendメソッドなどを使用しても新しいオブジェクトが生成されません。これにより、Stringクラスと比べてメモリを効率的に使用できます。
  • StringBuilderequals()メソッドを使って内容を比較するには、toString()メソッドを使ってString型に変換する必要があります。