
Javaの文字列連結には、下記のように色々な方法がありますよね。
- Stringクラスの+演算子を使った方法
- StringBufferを使った方法
- StringBuilderを使った方法
実行速度について
一般的には、実行速度は下記と言われています。
実際どうなのか?
それぞれ、10万回ループさせて、かかる時間を計測してみます。
+演算子
1 2 3 4 5 6 7 8 9 10 11 |
String plus = ""; long start = System.currentTimeMillis(); for(int i = 0 ;i < 100000;i++) { plus = plus + "あ"; } long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); |
実行結果
StringBuilder
1 2 3 4 5 6 7 8 9 10 11 |
StringBuilder sb = new StringBuilder(); long start = System.currentTimeMillis(); for(int i = 0 ;i < 100000;i++) { sb = sb.append("あ"); } long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); |
実行結果
StringBuffer
1 2 3 4 5 6 7 8 9 10 11 |
StringBuffer sb = new StringBuffer(); long start = System.currentTimeMillis(); for(int i = 0 ;i < 100000;i++) { sb = sb.append("あ"); } long end = System.currentTimeMillis(); System.out.println((end - start) + "ms"); |
実行結果
一般的には、「StringBuilder > StringBuffer >>>>> プラス演算子」と言われていますが、「StringBuffer > StringBuilder >>>>> プラス演算子」になりましたね。
試した順番にもよるのかもしれませんね。
StringBuilder
1 2 3 4 5 |
StringBuilder sb = new StringBuilder(); sb.append("あ"); sb.append("い"); sb.append("う"); System.out.println(sb.toString()); |
インスタンスの内部に連結した文字列を蓄えるメモリ領域を保持しています。
一番速度が速いので、たいていの場合はこれを使いましょう!
メリット
可変な設計なので、文字列をappendメソッドで追加する度に、newすることなく、メモリに新たに追加していくので非常に高速。
デメリット
基本的には、速度の早い「StringBuilderクラス」を使えばいいのですが欠点もあります。
スレッド処理(複数の処理を同時に行うためのJavaの仕組み)の場合に、不具合が発生する場合があります。
その場合は、代わりに「StringBufferクラス」を使用しましょう。
Stringbuffer
1 2 3 4 5 |
StringBuffer sb = new StringBuffer(); sb.append("あ"); sb.append("い"); sb.append("う"); System.out.println(sb.toString()); |
StringBuilderクラスに比べると若干遅いですが、それでも「+演算子」に比べると非常に早いです。
+演算子
1 2 |
String plus = "あ" + "い" + "う"; System.out.println(plus); |
+でStringを連結するたびに、古いインスタンスは捨てられて、新しいインスタンスがnewにより生成されています。
newによるインスタンスの生成は、JVMに非常に負荷をかけるので、StringBuilderや、StringBufferに比べると遅くなります。
メリット
- Stringクラスなので、いちいちソースコードの中にnewを書く必要がなくスッキリする。
- メソッドを使わず、ソースコードが直感的に理解できる。
まとめ
数個程度の文字列連結であれば、ソースコードの記述量が少ない「+演算子」を使いましょう。
ただ、例えば、CSVファイルを作る等の大量の文字列連結処理が発生する処理等は、「StringBuilder」もしくは、「StringBuffer」を使うようにしましょう!
文字列の型
Javaで、文字列を扱う場合は、Stringクラスを使用すると思います。
ただ、他にも下記のような扱い方をします。
char配列
Stringに含まれる文字をchar配列に格納します。
構文
Stringを、char配列に変換する場合は、Stringクラスの「toCharArrayメソッド」を使います。
用途
1文字ずつ、ループを回して、処理をしたい場合に使う。
サンプル
1 2 3 4 5 6 |
String str = "あいうえお"; char[] chrData = str.toCharArray(); for(int i=0;i<chrData.length;i++) { System.out.println(chrData[i]); } |
標準出力に、一文字ずつ文字を出力するサンプルです。
実行結果
byte配列
文字列の情報をバイト列に変換して、1バイトごとに配列に格納した状態にします。
構文
Stringを、byte配列に変換する場合は、Stringクラスの「getBytesメソッド」を使います。
用途
指定した文字コードでファイルに保存したりする場合に使用したりします。
サンプル
1 2 3 4 5 6 7 8 9 10 11 |
String str = "あいうえお"; try { byte[] byteData = str.getBytes("UTF-8"); for(int i=0;i<byteData.length;i++) { System.out.println(byteData[i]); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } |
この記事へのコメントはありません。