Stringクラスの使い方は皆さんご存知だと思います。しかし、StringBuilderというクラスはご存知でしょうか?
何をするためのクラスなの?
Stringクラスとはどう違うの?
といった疑問が出てくるかと思います。ここではそんな疑問を吹き飛ばしStringBuilderクラスの使い方やStringクラスとの違いを学び実際の開発で使えるようにしてみましょう!
ワンランク上のJavaプログラマを目指す方必見です!
なお、Javaの記事については、こちらにまとめています。
StringBuilderとは
StringBuilderは、Java5.0(Tiger)で新しく導入されたクラスです。そのためそれ以前のバージョンのJava(~Java1.4(Merlin))では使用できないため注意が必要です!
StringBuilderは、一言でいうと、Stringクラス同様、文字列を扱うクラスです。Stringクラスでなく、StringBuildeクラスを使うというのはどのような時なのでしょうか?
まず、Stringクラスについて復習も兼ねてお話しましょう。
Stringクラスについて
Stringクラスの問題点
皆さんも一度は使ったことがあるStringクラスでの文字列扱いは以下の様な実装になります。
public class Main { public static void main(String[] args) { for(int count = 0; count < 100; count++) { String cntval = Integer.toString(count); String result = "値は" + cntval; System.out.println(result); } } }
一見、何の問題もなく処理が動くように見られます。確かに問題なく実行できますがStringクラスが持つ、ある問題がここには潜んでいます。それは、「Stringクラスには一度セットした値を変更することはできない。」という問題です。
問題の原因
JavaのプログラムはVM(仮想マシン)というプログラムを実行するために必要な仕組みが存在します。
Javaでは変数を使用するために宣言を行いますが、宣言を行うことで値を保存しておくためのヒープ(保存スペース)をVMと呼ばれる仕組みの中に確保します。
前項のプログラムのようにループを用いて値をセットしていくような処理の場合、ループ処理で値がセットされる度にこの保存スペースが新しく作り直されます。
そのため無駄に保存スペースを食いつぶし処理速度の低下につながるという問題が起こります。100回、200回程度の処理ですと大した差ではありませんが数万件単位になるとその差は大きくなります。
StringBuilderを使う
そういったいくつかの問題を解決するためにStringBuilderを使ってみましょう。使い方については次のコードを見てみましょう。
class SamuraiSample { public static void main(String[ ] args) { StringBuilder val = new StringBuilder(); for(int count = 0; count < 100; count++) { String cntval = Integer.toString(count); val.append("値は" + cntval + "n" ); } System.out.println(new String(val)); } }
このプログラムでは最初にStringBuilderのインスタンスを生成しています。for文内では数値を文字列に変換し生成しStringBuilderのインスタン変数valにappendメソッドを使って追加します。
全ての追加が終わった後、printlnメソッドを使い文字列を表示しています。大量に文字列を繋げていく場合にこのappendメソッドを使うことがポイントです!
このようにStringBuilderを使うことで必要最小限の保存スペースだけを使い文字列を連結することができる<のです。
StringBuilderとStringBuffer
StringBufferとは
次にStringBufferについてお話します。StringBufferもStringBuilder同様、文字列を扱うクラスです。StringBufferクラスもStringBuilderクラス同様、Stringクラスが扱えない可変長の文字列の扱いに適しています。
StringBufferとの違いは?
先程StringBufferについて「StringBuilder同様」と記載しましたが、「StringBufferとStringBuilderって何が違うの?」「どちらかひとつでいいじゃん!」と思う方もいるかもしれません。
もちろん、StringBuilder・StringBufferそれぞれのクラスの相違点はあります。一言でいうと、「StringBuilderはシングルスレッド(バッチ処理のような直列処理)向き」「StringBuffferはマルチスレッド(並列処理)向き」ということになります。
シングルスレッドやマルチスレッドについてよくわからないと思う方やStringBufferについては下記で詳しく使い方や違いを説明しています。ぜひ読んでみて下さい!
まとめ
StringBuilderについてお話させて頂きました。StringBuilderについてのおさらいです!
- Java5.0 以降から使用可能
- ループ内で文字列の操作(連結や挿入)を行いたいとき
にStringBuilderを使うと良いでしょう。「StringBuilderってなんだったっけ?」 と思ったらぜひこの記事を読み返してください!