JavaのStringを扱う上で、文字列同士を結合することがあります。
文字列を結合する方法を知りたい
文字列がnullの場合の対処法を知りたい
文字列をカンマ区切りで結合する方法を知りたい
文字列を結合するメソッドの速度が知りたい
今回は、そんな悩みを解決するために、文字列を結合するための方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
Stringの結合方法
ここでは、Stringの文字列を結合する方法を紹介します。
concatを使用する
文字列を結合するオーソドックスな方法として、Stringクラスのconcatメソッドを使用する方法があります。
以下にconcatメソッドを使用した文字列の結合方法を記述します。
public class Main { public static void main(String[] args) throws Exception { //Stringクラスのconcatを使用する String str1 = "apple"; String str2 = "orange"; String str = str1.concat(str2); System.out.println("str : " + str); } }
実行結果
str : appleorange
サンプルでは2つのString型に文字列を設定し、変数str1に対してconcatメソッドで引数に変数str2を指定しています。
concatについては、以下の記事で詳しく解説しています!
StringBufferのappendを使用する
StringBufferクラスのappendメソッドを使用することでも、文字列を結合することが可能です。
以下にStringBufferクラスのappendメソッドを使用した結合方法を記述します。
public class Main { public static void main(String[] args) throws Exception { //StringBufferクラスのappendを使用する String str1 = "apple"; String str2 = "orange"; StringBuffer bf = new StringBuffer(); bf.append(str1); bf.append(str2); System.out.println("bf : " + bf.toString()); } }
実行結果
bf : appleorange
サンプルでは2つのString型に文字列を設定し、StringBufferクラスを宣言して、変数bfに対してappendメソッドを使用して文字列を結合しています。
StringBufferについては、以下の記事で詳しく解説しています!
StringBuilderのappendを使用する
StringBuilderクラスのappendメソッドを使用することでも文字列を結合することが可能です。
以下にStringBuilderクラスのappendメソッドを使用した結合方法を記述します。
public class Main { public static void main(String[] args) throws Exception { //StringBuilderクラスのappendを使用する String str1 = "apple"; String str2 = "orange"; StringBuilder sb = new StringBuilder(); sb.append(str1); sb.append(str2); System.out.println("sb : " + sb.toString()); } }
実行結果
sb : appleorange
サンプルでは2つのString型に文字列を設定し、StringBuilderクラスを宣言して、変数sbに対してappendメソッドを使用して文字列を結合しています。
StringBufferについては、以下の記事で詳しく解説しています!
結合する文字列がnullの場合
文字列を結合するときの注意点として、結合する文字列がnullだった場合、例外が投げられてしまいます。
以下の処理では、結合対象の文字列がnullで設定されているため、”java.lang.NullPointerException”の例外が発生します。
public class Main { public static void main(String[] args) throws Exception { String str1 = "apple"; String str2 = null; String str = str1.concat(str2); System.out.println("str : " + str); } }
そのため、例外を回避するにはStringUtilsクラスのisEmptyメソッドを使用します。
isEmptyメソッドについては、以下の記事で詳しく解説しています。
文字列をカンマ区切りで結合する
文字列を結合してCSVファイルなどに出力するときに、文字列の間に’,’(カンマ)を挿入したい場合があります。
カンマ区切りで文字列を結合する方法を、以下に記述します。
public class Main { public static void main(String[] args) throws Exception { //文字列をカンマ区切りで結合する String[] strArray = {"apple","orange","melon","banana","pineapple"}; String sep = ","; StringBuilder sb = new StringBuilder(); for(String str : strArray) { if (sb.length() > 0) { sb.append(sep); } sb.append(str); } System.out.println(sb.toString()); } }
実行結果
apple,orange,melon,banana,pineapple
サンプルではString型の配列に文字列を設定し、String型でカンマを設定しています。
次にStringBuilderクラスを宣言し、拡張for文の中で配列の要素ごとにappendメソッドを使用して、カンマと文字列を交互に結合しています。
速度面での比較
文字列を結合する基本的な方法を3通り説明しましたが、実際の処理パフォーマンスはどうなのでしょうか?
ここでは、紹介したStringクラスのconcatとStringBufferクラスのappend、StringBuilderクラスのappendの速度を、それぞれナノ秒単位で比較してみました。
public class Main { public static void main(String[] args) throws Exception { /* 文字列結合の速度判定 */ /* StringクラスのconcatとStringBufferクラスのappend、*/ /* StringBuilderクラスのappendをそれぞれ比較する */ //1. concat long start1 = System.nanoTime(); String strcon = ""; for(int val=0; val<100; val++) { strcon = strcon.concat("strcon : " + Integer.toString(val) + "\n"); } //concat終了時間 long end1 = System.nanoTime(); System.out.println("String.concat : " + (end1 - start1) / 1000000f + "ms"); //2. StringBuffer.append long start2 = System.nanoTime(); StringBuffer bf = new StringBuffer(); for(int val=0; val<100; val++) { bf.append("bf : " + Integer.toString(val) + "\n"); } //StringBuffer.append終了時間 long end2 = System.nanoTime(); System.out.println("StringBuffer.append : " + (end2 - start2) / 1000000f + "ms"); //3. StringBuilder.append long start3 = System.nanoTime(); StringBuilder sb = new StringBuilder(); for(int val=0; val<100; val++) { sb.append("sb : " + Integer.toString(val) + "\n"); } // StringBuilder.append終了時間 long end3 = System.nanoTime(); System.out.println("StringBuilder.append : " + (end3 - start3) / 1000000f + "ms"); } }
実行結果
String.concat : 0.679138ms StringBuffer.append : 0.422932ms StringBuilder.append : 0.253999ms
サンプルでは、ループの中でそれぞれ100回ずつ文字列を結合しています。
実行結果を確認する限りでは、StringBuilderクラスのappendが一番早いことがわかります。
次いでStringBufferクラスappend、一番遅いのがStringクラスのconcatとなりました。
Stringについてもっと詳しく知りたい方へ
Stringのさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
ここでは、さまざまな文字列の結合方法や注意点、カンマ区切りでの結合方法や、それぞれの結合処理の速度比較などを行いました。
文字列を結合する処理は、さまざまな場面で使用することがあります。
もし、文字列を結合する方法を忘れてしまったら、この記事を思い出してくださいね!