[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] テキストファイルの読み込み方法

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

記事を読む

no image

[Java] CSVファイルの読み込み方法

こんにちは、kei0310です。 CSVファイルをJavaに取り込む方法を解説します。

記事を読む

no image

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

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

記事を読む

no image

[Java] Apache POIでExcel操作!

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

記事を読む

no image

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

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

記事を読む

no image

[Java][JSP] EclipseでのJSP作成

今回は、Eclipseを用いてJSPを作成してみます。 まず、Eclipseを起動します。

記事を読む

no image

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

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

記事を読む

no image

[Java] Javaのインストール(プログラム開発・入門用)

Javaのコードを書きたい!! という目的のためのJavaのインストール方法と、コマンドラインでの

記事を読む

no image

[Java][Eclipse] Mavenが利用可能な動的Webプロジェクトの作成

こんにちは、keiです。 今回は、Mavenが利用可能な動的Webプロジェクトの作成について解

記事を読む

no image

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

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

記事を読む

スポンサードリンク

Message

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

スポンサードリンク

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

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

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

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

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

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

no image
[python] 日付の取り扱い(datetime) 現在日付、計算、文字列変換(format)

現在日付 日付の計算 [crayon-5a5da56f216c

no image
[python] 文字列結合

pythonでの文字列結合 サンプル

→もっと見る

  • 2018年1月
    « 10月    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
  • 2018年1月
    « 10月    
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  
PAGE TOP ↑