【徹底解説】stringとStringBuilderの違いをぜんぶ分かる!使い分けのコツと実例

  • このエントリーをはてなブックマークに追加
【徹底解説】stringとStringBuilderの違いをぜんぶ分かる!使い分けのコツと実例
この記事を書いた人

中嶋悟

名前:中嶋 悟(なかじま さとる) ニックネーム:サトルン 年齢:28歳 性別:男性 職業:会社員(IT系メーカー・マーケティング部門) 通勤場所:東京都千代田区・本社オフィス 通勤時間:片道約45分(電車+徒歩) 居住地:東京都杉並区・阿佐ヶ谷の1LDKマンション 出身地:神奈川県横浜市 身長:175cm 血液型:A型 誕生日:1997年5月12日 趣味:比較記事を書くこと、カメラ散歩、ガジェット収集、カフェ巡り、映画鑑賞(特に洋画)、料理(最近はスパイスカレー作りにハマり中) 性格:分析好き・好奇心旺盛・マイペース・几帳面だけど時々おおざっぱ・物事をとことん調べたくなるタイプ 1日(平日)のタイムスケジュール 6:30 起床。まずはコーヒーを淹れながらニュースとSNSチェック 7:00 朝食(自作のオートミールorトースト)、ブログの下書きや記事ネタ整理 8:00 出勤準備 8:30 電車で通勤(この間にポッドキャストやオーディオブックでインプット) 9:15 出社。午前は資料作成やメール返信 12:00 ランチはオフィス近くの定食屋かカフェ 13:00 午後は会議やマーケティング企画立案、データ分析 18:00 退社 19:00 帰宅途中にスーパー寄って買い物 19:30 夕食&YouTubeやNetflixでリラックスタイム 21:00 ブログ執筆や写真編集、次の記事の構成作成 23:00 読書(比較記事のネタ探しも兼ねる) 23:45 就寝準備 24:00 就寝


はじめに:stringとStringBuilderの基本的な違い

最初に押さえておきたいのは stringStringBuilder はどちらも文字の集まりを扱う道具だが性質が違う点で使い分けが生まれるということだ。
string は不変 immutable という性質を持ち一度作ると中身を変えられない。だから文字列を結合するたびに新しい string が作られ古いものは捨てられることになる。
この挙動は簡単に言えば記憶の使い方が一瞬増えたり減ったりするようなイメージでメモリや時間のコストがかかる場面が出てくる。
ここで登場するのが StringBuilder だ。StringBuilder は可変 mutable で文字列を追加したり置き換えたりしても同じオブジェクトを使い続けられる。中身を追加しても新しいオブジェクトを作る必要がないので文字列の連結が頻繁に発生する場面では効率が良い。
この二つの違いを理解することがプログラムの速度とメモリの使い方を最適化する第一歩になる。
本記事では初心者の人にも分かるように具体的な例とともに説明していく。風景を思い浮かべると分かりやすい。string は長い川を静かに流れる水のようにいつも同じ場所を通るが途中で姿を変えられない。StringBuilder は川の流れを調整できるように泳ぐ魚の群れのように流れを自由に変更できる。
この違いを頭の中に刻んでおくと次にコードを読んだとき自分の意図に合った選択ができるようになる。まずは基本的な使い方の比較から見ていこう。

実際の違いを分解する:イミュータブルと可変の考え方

ここではイミュータブル immutable と可変 mutable の考え方を学ぶ。string は作成後に中身を変更できないという点で immutable だ。例えば a という string を作って B に変えようとしても新しい文字列 が新しく生成されるだけで元の a は壊れない。これがプログラムの前半から後半へと影響する。
一方で StringBuilder は内部で可変の配列を持ちその配列を結合や追加で拡張していく。これにより連結処理のコストを抑えられる。
この性質の違いはループ内で文字列を何度も連結する時のパフォーマンス差として現れることが多い。例えば大量の文字を順番に追加する処理では StringBuilder を使うべきだ。
ただし注意点としては StringBuilder は最終的な文字列を取り出す時に toString を呼ぶ必要がありその分のオーバーヘッドが発生することもある。これも状況次第で候補を絞る理由になる。
この節では次の実例で実感できる差を見ていく。まずはシンプルな連結の例から。

使い分けのコツと実用例

日常のプログラミングで string と StringBuilder をどう使い分けるかのコツをまとめる。
1つ目のコツは連結を何度も行う場合は StringBuilder を使うことだ。特にループの中で文字列を追加するケースでは絶対に効く。
2つ目のコツは完成形の文字列を1回だけ作るなら string を使うべきだ。
3つ目のコツは邪魔にならないようにメソッドの設計をすること。StringBuilder をパラメータとして受け取る設計は柔軟性を高める。
実用例としてファイルから行を読み込みそれを1つの文字列にまとめる処理を考える。最初は StringBuilder で逐次追加し最後に toString で取り出す。ファイルサイズが大きくなるほどこの方法の恩恵は大きい。
もう一つの例として配列の要素をつなぐ場合も StringBuilder が効く。配列のサイズが不確定な時は特に有利だ。結局のところ目的とコストのバランスを見て選択するのが大切だ。
この節の要点は 変性と不変性の理解パフォーマンスのトレードオフ を意識することだ。今までのイメージを実際のコードに落とし込み手を動かして体感してみよう。

よくある誤解と注意点

よくある誤解の一つは StringBuilder を使えば常に速い というものだ。実は使い方次第で String のほうが自然で速い場面もある。例えば文字列の結合が一度きりのケースや読みやすさを優先したい時には String を選ぶほうが適している。
二つ目の誤解は toString のコストは無視できない ことだ。サイズが大きい場合は追加のメモリと時間が必要になることがある。
三つ目の注意点は スレッドセーフかどうか だ。StringBuilder は基本的にスレッドセーフではない同時に複数のスレッドが編集するようなケースでは StringBuffer のほうが適している場合がある。ただし StringBuffer は性能が落ちるので設計を工夫することで回避できることが多い。
結論としては道具は場面に応じて選ぶのが正解だ。最初は小さなコードから試しパフォーマンスのボトルネックを見つけることが成長につながる。以下は簡易な比較表と実用例のまとめだ。

ble>ポイントStringStringBuilder不変性不変可変主な用途不変な文字列の保持頻繁な文字列連結性能の傾向連結多いと非効率連結多いと効率的
ピックアップ解説

友達と放課後に雑談するような雰囲気で深掘りします まずキーワードはイミュータブル 不変性についての話を中心に 細かい操作をしても元の文字列は変わらない そんな性質があるから別の場所で何回も連結するときには 不要な新しい文字列が増えやすい そこで現れるのが StringBuilder という道具 連結を繰り返す現場では StringBuilder は姿を変えずに文字を足していける だから速度が速くなる ただ使い方を間違えると toString のコストやメモリの使い方で損をすることもある ここから人は実践的にどう使い分けるかを体感していく


ITの人気記事

ズームとズームワークプレイスの違いとは?初心者でもわかる徹底解説!
1191viws
青写真と青焼きの違いとは?簡単解説でわかりやすく理解しよう!
978viws
「画素(ピクセル)とは何?解説と画像の違いをやさしく理解しよう」
843viws
スター結線とデルタ結線の違いを徹底解説!初心者でも分かる電気の基本
698viws
CADデータとDXFデータの違いを徹底解説!初心者でもわかる使い分けのポイント
690viws
HTTPとHTTPSの違いをわかりやすく解説!安全なネット利用のために知っておきたいポイント
543viws
5GとXi(クロッシィ)ってどう違うの?初心者にもわかりやすく解説!
537viws
初心者でもわかる!しきい値と閾値の違いを徹底解説
521viws
RGBとsRGBの違いって何?初心者でもわかる色の基本知識
512viws
API仕様書とIF仕様書の違いを徹底解説!初心者でもわかるポイントとは?
504viws
RGBとVGAの違いを徹底解説!初心者にもわかりやすい映像信号の基礎知識
495viws
インプレッション数とクリック数の違いを徹底解説 — CTRを上げるための基礎と落とし穴
489viws
IPアドレスとデフォルトゲートウェイの違いをわかりやすく解説!ネットワークの基本を理解しよう
482viws
SSDとUSBメモリの違いを徹底解説!初心者でもわかる保存デバイスの選び方
482viws
インターフォンとインターホンの違いって何?わかりやすく解説!
460viws
モバイルデータ通信番号と電話番号の違いを徹底解説!初心者でもわかるスマホの基礎知識
443viws
USB充電器とアダプターの違いとは?初心者にもわかりやすく解説!
427viws
グロメットとコンジットの違いとは?わかりやすく解説!
417viws
USBフラッシュメモリとUSBメモリの違いとは?初心者でもわかる解説!
399viws
cookieとtokenの違いを徹底解説!ウェブの安全と使い分けのポイントを中学生にもわかる言葉で
396viws

新着記事

ITの関連記事