[Java] StringBuilderの使い方(Stringを連結するクラス)

公開日: : Java, 基本 , , , ,

今回は、可変長文字列クラスのStringBuilderを紹介します。

固定長文字列クラスのStringと異なる点は以下になります。

●文字列を連結・削除をメモリ消費を抑えて実行可能

<Stringの場合>

Stringで文字列を連結すると、余計なオブジェクト生成を行ってしまいます。

例)
StringA = "abc"
StringB = "def"
StringC = "ghi"
StringD = "jkl"

StringA + StringB + StringC + StringDを行う場合、
前の連結処理から順番に実行されるため、
以下のオブジェクトが連続的に生成されます。

StringA + StringB = "abcdef" のオブジェクト
StringA + StringB + StringC = "abcdefghi" のオブジェクト
StringA + StringB + StringC + StringD = "abcdefghijkl" のオブジェクト

「Stringクラスが自身を変更できないため、新しいStringクラスを常に生成する」
ことが原因で発生している事象です。

そのため、forやwhileでループした処理中にStringの文字列連結を書くと
乗算で使用メモリが増大していきます。よって、
「メモリを大量に消費+ガベージコレクション処理でパフォーマンス低下」が発生します。

<StringBuilderの場合>

対して、上記の処理をStringBuilderで行ってみます。

StringA~Dは同一です。

// StringBuiilderオブジェクト生成
StringBuilder builder = new StringBuilder();

// StringA~Dを連結
builder.append(StringA)
builder.append(StringB)
builder.append(StringC)
builder.append(StringD)

builderオブジェクトは無指定だと16バイトの領域を自身に持っていて、
appendされた文字列を自身の領域にコピーします。
ですので、自身の領域を超えない限りは追加の領域を作成しません。

ただし、16バイトを超えた場合、「(以前の領域+1)*2」の領域を
新しく確保するため、頻繁に領域更新が発生すると、
Stringまではいきませんが、パフォーマンス低下が起こります。

それを防ぐためには、StringBuilderをnewするときにサイズを指定します。

// 10000バイトでStringBuilderを作成
StringBuilder builder = new StringBuilder(10000);

あまりに大きく領域を確保してしまうと、それはそれで無駄ですので、
処理に応じた適切な領域を確保しましょう。

最後に簡単な例を紹介します。

public class TestStringBuilder {

	public static void main(String[] args){

		// 無指定の場合、16バイトで初期化
		StringBuilder builder = new StringBuilder();

		// 10文字追加(合計10バイト)
		builder.append("1234567890");
		// 10文字追加(合計20バイト):ここで、(16+1)*2=34バイトに拡張される。
		builder.append("1234567890");
		// 10文字追加(合計30バイト)
		builder.append("1234567890");
		// 10文字追加(合計40バイト):ここで、(34+1)*2=70バイトに拡張される。
		builder.append("1234567890");

		// 標準出力に表示(toString()すればStringで出力可能)
		System.out.println(builder.toString());

	}
}

スポンサードリンク

関連記事

no image

[java] 文字列の一部を切り取る方法(substring)

こんにちは。 今回は文字列の一部を切り取る方法について解説します。 具体的には、String

記事を読む

no image

[Java] 日付の計算方法(DateFormat、Date、Calendar)

こんにちは、kei0310です。 Javaで日付を計算する方法について解説します。 まず

記事を読む

no image

[Java] Apache POIでExcel操作!

Apache POIをまずは使ってみようという方(自分も含め)のメモ 導入 Maven htt

記事を読む

no image

[Java][基本] mainメソッドの書き方

こんにちはkeiです。 Javaの基本として、意外と知らないmain関数について解説します。

記事を読む

no image

[Java] テキストファイルの読み込み方法

こんにちは、今回はテキストファイルをJavaで読む方法を紹介します。 標準で提供されているクラ

記事を読む

no image

[Java] 文字列の分割(split)

こんにちは。 今回は、文字列の分割について解説します。 昔はStringTokenize

記事を読む

no image

[Java][Servlet] EclipseでのJavaServlet作成

こんにちは、今回はEclipseを使用してJavaServletを作成します。 Eclipse

記事を読む

no image

[Java][Servlet][JSP] ServletからJSPへの転送

こんにちは。 今回は、「Servletでリクエストを受けて、JSPで表示する。」方法を解説しま

記事を読む

no image

[Java][Spring] DIする方式を細かく見てみる① @ScopeでのSingletonとPrototypeの指定

今回は@Scopeアノテーションを用いて、オブジェクトをDIする方式を選択してみます。 ●解説

記事を読む

no image

[Java][基本] ループ処理(for文)

Javaのループ処理の基本である、for文を解説します。 ●文法 for( [①初期化];

記事を読む

スポンサードリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スポンサードリンク

no image
[git] Windowsへのインストール(Git for Windows)

概要 Windows環境にGitをインストールします。 インストー

no image
[Fluentd] WindowsにFluentdをインストールする

WindowsにFluentdをインストールしたときのメモ 参考にさ

no image
[Re:dash] BigQuery接続で日本語タイトルを出す(v2.0.0)

BigQueryは現在マルチバイトを含むSQLを発行することができない

no image
[Python] Nullの判定方法(None)

Nullの判定方法(None) 表記方法 Pythonでは、Nul

no image
[Python] 型の検査・判定

Pythonでの型の検査・判定方法 isinstance サン

→もっと見る

  • 2018年12月
    « 6月    
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31  
  • 2018年12月
    « 6月    
     12
    3456789
    10111213141516
    17181920212223
    24252627282930
    31  
PAGE TOP ↑