こんにちは!しーま(@s59shima)です。
いつもブログをご覧いただきありがとうございます。
今回は、こんな悩みや疑問のある方に向けて記事を書きました。

文字列を結合する方法って複数あるみたいだけど、使い分けはどうしたらいいの!?
文字列を結合する方法や使い分けについて詳しく知りたい方にはオススメの記事です。
≪人気企業のおすすめ求人を確認してみよう!≫
無料会員登録はこちら
文字列を結合す方法は3パターン
開発現場で文字列を結合する場面は非常に多いと感じます!
代表的な文字列結合は、以下の3パターンです。
文字列を結合する3パターン
- プラス(+)演算子
- Stringクラスのconcatメソッド
- StringBuilderクラス
後で詳しく解説を行いますが、2~3個程度の文字列結合なら「プラス演算子」や「Stringクラスのconcatメソッド」を使用して結合するのもアリです。
ですが、数10個~数100個の文字列を結合するなら「StringBuilderクラス」を使用して文字列を結合することも検討したほうが良いです。
理由は処理速度(パフォーマンス)に影響するからです。
プラス(+)演算子を使う
■サンプルコード
結合したい文字列を +(プラス演算子)でつなぎます。
サンプルでは【message1】と【message2】の変数を結合しています。
public class Sample {
public static void main( String args[] ) {
String message1 = "Hello";
String message2 = "World";
String output = message1 + message2;
System.out.print( output );
}
}
■実行結果
HelloWorld
Stringクラスのconcatメソッドを使う
■サンプルコード
結合元の変数message1(文字列型->String)でconcatメソッドを使用しています。
public class Sample {
public static void main( String args[] ) {
String message1 = "Hello";
String output = message1.concat("World");
System.out.print( output );
}
}
■実行結果
HelloWorld
StringBuilderクラスを使う
■サンプルコード
StringBuilderクラスのappendメソッドを使用して文字列を結合しています。
public class Sample {
public static void main( String args[] ) {
StringBuilder sb = new StringBuilder();
sb.append( "Hello" );
sb.append( "World" );
System.out.print( sb.toString() );
}
}
■実行結果
HelloWorld
文字列の結合にStringBufferクラスは有効か!?
StringBuilderクラスと似たクラスが存在します。それがStringBufferクラスです。どちらも主要な機能は同じです。
ただ両者には決定的な違いがあるそうです。それがスレッドセーフであるかどうかです。
複数スレッドのように並列処理などが含まれる場合は、StringBufferの健全なようです。
シンプルな処理(※複数スレッドの活用など)であればStringBuilderで構わないですね。
区切り文字を指定して文字列を結合するには
複数の文字列をカンマやハイフンなどの区切り文字を指定して結合したい場合もあるのではないでしょうか!?そんなときはStringクラスのjoinメソッドを使用すれば一発で実現できますよ!
Stringクラスのjoinメソッドを使う
JDK8から誕生したjoinメソッドを使用すればシンプルに実現ができます。
■サンプルコード
年月日がそれぞれ分かれている場合にハイフン(‐)で結合するサンプルコードです。
import java.util.ArrayList;
import java.util.List;
public class Sample {
public static void main( String args[] ) {
List<String> messageList = new ArrayList<String>();
messageList.add("2020");
messageList.add("03");
messageList.add("14");
String message = String.join("-", messageList);
System.out.println( message );
}
}
■実行結果
2020-03-14
≪ブラウザだけですぐに始められる!≫
オンラインPython学習サービス「PyQ™(パイキュー)」
文字列と数値の結合には注意が必要
プラス演算子で結合する場合・StringBuilderで結合する場合、文字列と数値が混ざっていると注意が必要です。
以下のサンプルコードを実行した場合、実行結果はどのようになるでしょうか・・・
サンプルコード
public class Sample {
public static void main( String args[] ) {
int num1 = 10;
int num2 = 20;
String message = "Hello";
String output = num1 + message + num2;
System.out.print( output );
StringBuilder sb = new StringBuilder();
sb.append( 10 );
sb.append( "Hello" );
sb.append( 20 );
System.out.println( "StringBuilderの場合:" + sb.toString() );
}
}

実行結果:Stringの場合:10Hello20
実行結果:StringBuilderの場合:10Hello20
数値と文字列を結合した場合、エラーにはならず、文字列として結合する形となるので注意しましょう!
文字列の結合にNullがあると危険・・・
プラス演算子で結合する場合、Nullが混ざっていると、想定する結果にはならず、表示も不正となってしまいます。
サンプルコード
public class Sample {
public static void main( String args[] ) {
int num1 = 10;
int num2 = 20;
String message = null;
String output = num1 + message + num2;
System.out.println( "Stringの場合:" + output );
}
}
実行結果:Stringの場合:10null20
文字列を結合する速度を計測
以上で文字列を結合する3つのパターンを解説しました。ここで、3つの結合方法について処理速度を計測してみます。
単純に「あ」という文字を指定した回数(100・1000)を結合するプログラムを用いて処理時間を計測します。
サンプルコード
※実行速度をナノ秒(System.nanoTime())で計測しています。
public class Sample {
public static void main( String args[] ) {
long startTime = 0;
long endTime = 0;
final int COUNT = 100;
// プラス演算子
startTime = System.nanoTime();
String str1 = "";
for ( int i = 0; i < COUNT; i++ ) {
str1 += "a";
}
endTime = System.nanoTime();
System.out.println( (endTime - startTime) + ":プラス演算子" );
// String -> concat
startTime = System.nanoTime();
String str2 = "";
for ( int i = 0; i < COUNT; i++ ) {
str2 = str2.concat("a");
}
endTime = System.nanoTime();
System.out.println( (endTime - startTime) + ":Stringクラスのconcatメソッド " );
// StringBuilder -> append
startTime = System.nanoTime();
StringBuilder sb = new StringBuilder();
for ( int i = 0; i < COUNT; i++ ) {
sb.append("a");
}
endTime = System.nanoTime();
System.out.println( (endTime - startTime) + ":StringBuilderクラス " );
}
}
実行結果
結合回数が100回(No.1~3)と1000回(No.4~6)の実行結果を表にまとめました。
No | 結合回数 | 処理速度 | 結合方法 |
---|---|---|---|
1 | 100 | 102100 | プラス演算子 |
2 | 100 | 37000 | String -> concat |
3 | 100 | 28400 | StringBuffer |
4 | 1000 | 1759800 | プラス演算子 |
5 | 1000 | 592900 | String -> concat |
6 | 1000 | 118900 | プラス演算子 |
結合回数が100の場合、最大73,700ナノ秒の差、1000回の場合は、最大1,640,900ナノ秒の差があることが分かりました。
結合回数が多ければ多いほど、差が開くことがわかりますね。
実際には、文字列の結合は数回(4~5回)がほとんどかと思いますが、結合するパターンにパフォーマンスが影響すると理解しておいてください!
まとめ
今回は、文字列を結合する方法・使い分けについて解説しました。
最後まで読んでいただきありがとうございました。
本記事をまとめると以下の通りです。
文字列を結合する3パターン
- プラス(+)演算子
- Stringクラスのconcatメソッド
- StringBuilderクラス