[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][基本] ループ処理(for文)

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

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

[Java][Jersey] JerseyでRESTfulなJAX-RS Webサービス作成

こんにちは、keiです。 今回はRESTfulなWeb Serviceの作成を行っていきます。

記事を読む

no image

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

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

記事を読む

no image

[Java][Spring] Spring3でDIしてみる!(アノテーション使用)

Spring3を使って、一番基本的な形のプログラムを作成してみます。 今回は、アノテーションを

記事を読む

no image

[Java][Framework] Spring BootのJPAでDB接続した際のEntityキャッシュのクリア方法

Spring BootのJPAでDBアクセスした際に、処理を一定量こなすと、Heapが足りなくな

記事を読む

no image

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

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

記事を読む

no image

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

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

記事を読む

no image

[Java][MySQL] JavaからMySQLを使う方法

MySQLは、フリーでありながら商用としても使用できるパワーを持つデータベース(RDB)です。

記事を読む

スポンサードリンク

Message

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

スポンサードリンク

no image
CentOSにdockerをインストールしてみた

前置き dockerをcentos7にインストールしてみました

no image
awkでのgsubを使った文字列置換(正規表現)

まえおき bashなどのシェルスクリプトで、lsした結果とかを

no image
bashで並列処理する方法(xargs)

並列処理とは 通常、意識せずにプログラムを書くと、大体の場合は

no image
AWS Redshiftの使用ストレージ容量をクエリで調べる方法

用途 AWS Redshfitのコンソールを見れば、使用中のス

no image
pythonでstorage transfer serviceを使ってみた。

準備 pythonのインストールとかする。 このあたり。

→もっと見る

  • 2024年11月
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
  • 2024年11月
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
PAGE TOP ↑