Javaでの文字列の連結

文字列の連結は、2 つ以上の小さな文字列をマージして最終的な文字列を作成する操作です。たとえば、人物の姓と名を連結してフルネームを作成できます。Javaには文字列を連結する方法がいくつか用意されていますが、最も簡単なのは+演算子を使用することです。 あります  Javaで文字列を連結する4つの方法:
  1. 連結演算子 '+'
  2. 関数 String.concat()
  3. StringBuilder
  4. StringBuffer

演算子 +

演算子 '+' を使用して 2 つ以上の文字列を連結する場合、これが最も簡単な方法です。たとえば、"One" + "Two" は String オブジェクト "OneTwo" を生成します。この演算子を使用して、少なくとも 2 つの文字列を組み合わせることができます (例: "ab"+"cde"+fghi" は "abcdefghi" を与え、文字列変数を使用することもできます。
この操作はコンパイラによって次のように変換されます:

new StringBuilder().append("string1").append("string2").toString()
このプログラムは、次の 2 つの文字列を連結します。

public class Concatenation_string {
public static void main(String[] args) {
String s1 = "string1";
文字列 s2 = "文字列2";

文字列 s1s2 = concatenation_strings_java(s1, s2);
System.out.println(s1s2);
}

public static String concatenation_strings_java (String s1, String s2) {
return s1+s2;
}
}
Runtime:

string1chain2

String.concat()このメソッドは、1つのStringを別のStringの末尾に連結します。このメソッドは、連結されたメソッドで渡された String の値を持つ String と、そのメソッドの呼び出しに使用された String の末尾を返します。

public String concat(String s)
Example:

public class Concatenation_string {
public static void main(String[] args) {
String s = "私は一人です";
s = s.concat(" プログラマ");
System.out.println(秒);
}
}
Runtime:

私はプログラマーです

'+' 演算子と String.concat()

'+' と concat()では、実用的な例を使用します.

a+=b
a.concat(b)
まず、セマンティクスに小さな違いがあります。a が null、次に a.concat(b)NullPointerException ですが、'+'宅配便 新品", "宅配便"、ミニバン;">a+=b は a nullです。さらに、concat() は String 値のみを受け入れ、'+' 演算子は toString() ) です。メソッド concat() は、

このコードを記述して、出力で何が得られるかを確認できます:

public static void main(String[] args) {
String s = null;
s = s.concat(" プログラマ");
System.out.println(秒);
}
実行時にこれが必要です:

スレッド "main" java.lang.NullPointerException
at Concatenation_string.main(Concatenation_string.java:5)

'+':

public static void main(String[] args) {
String s = null;
s = s + プログラマ;
System.out.println(秒);
}
次の結果が得られるはずです:

nullprogrammer
したがって、先に述べたように、演算子 '+' は以下と同等です:

a = new StringBuilder()
.append(a)
.append(b)
.toString();

StringBuffer と StringBuilder を使用して文字列を連結する

この連結手段では String オブジェクトが生成されないため、メモリと時間のコストが削減されます。実際、StringBuffer は同じ機能を持ちますが、同期を行わないため、常に StringBuilder を使用する必要があります。StringBuffer または StringBuilder を使用すると、次のような構造化コードも生成されます

String result = new StringBuilder(15).append(name).append(" ").append(firstname).toString();
StringBuilder を使用して複数の文字列を連結するのがいかに簡単かがわかります。ただし、StringBuilder は、最終的な文字列の文字数と同じ容量で初期化することを忘れないでください。これにより、String を適切に初期化することで、使用できないメモリが失われるのを防ぎ、CPU 時間を短縮できます。

String と StringBuilder および StringBuffer を連結する方法を示す Java プログラムの例です。

public static void main(String[] args) {
String court ="Court of";
文字列 module_math ="数学";

/* StringBuilder */
String module_res = "networks";
int length = court.length()+module_math.length();
StringBuilder sb = new StringBuilder(length);
sb.append(court).append(module_math);
文字列 res = sb.toString();
System.out.println(res);

/* StringBuilder */
length = court.length()+module_math.length();
StringBuffer sBuffer = new StringBuffer(length);
sb.append(" and").append(court).append(module_res);
res = sb.toString();
System.out.println(res);
}
Output:

 Math Courtyard
Math Courtyard and Network Courtyard

Performance of String Concatenation in Java

文字列を連結する最も簡単で最速の方法は、'+'演算子を使用することであることは明らかですまた、文字列が2つしかない場合は非常にうまく機能しますが、何千もの文字列を連結する必要があり、特にループ内では、「+」演算子を使用するとパフォーマンスが低下します。パフォーマンスの低下の原因は、Stringオブジェクトの一時的なバッチの作成です。プログラムに多数の文字列がある場合、大規模な連結の最良の方法は StringBuilder です。これらの統計は、Windows 7 64ビット環境、Core 2 Duoプロセッサ(2.53 GHz)、4 GBのRAMで作成されました.

public static void main(String[] args) {
int nb_op=10000;
文字列 s="";

double t1,t2,time;
t1= System.currentTimeMillis();
for(int i = 0 ; i < nb_op; i++)
s += "*";
t2 = System.currentTimeMillis();
時間= t2-t1;
System.out.println("+: "+time);

s="";
t1= System.currentTimeMillis();
for(int i = 0 ; i < nb_op; i++)
s.concat("*");
t2 = System.currentTimeMillis();
時間= t2-t1;
System.out.println("連結: "+時間);

StringBuilder sb=new StringBuilder();
t1= System.currentTimeMillis();
for(int i = 0 ; i < nb_op; i++)
sb.append("*");
t2 = System.currentTimeMillis();
時間= t2-t1;
System.out.println("StringBuilder: "+time);

StringBuffer sBuffer=new StringBuffer();
t1= System.currentTimeMillis();
for(int i = 0 ; i < nb_op; i++)
sBuffer.append("*");
t2 = System.currentTimeMillis();
時間= t2-t1;
System.out.println("StringBuffer: "+time);
}
10000 個の連結操作の結果:

+: 180.0
concat: 13.0
StringBuilder: 2.0
StringBuffer: 4.0
JavaでのStringBuilder、StringBuffer、およびconcatのパフォーマンス10000回の操作のミリ秒単位の時間
操作数の関数として達成された時間を示す別のグラフ:

Javaの文字列連結時間

第一印象は素晴らしいです!ここでは、演算子「+」によって達成された時間は連結操作の数に比例し、100000回の操作で10秒が経過していることにすぐに気付くでしょう。したがって、「+」演算子は、大規模なプロジェクトで作業する場合、非常に悪い選択です。concat、StringBuilder、StringBufferは'+'演算子からは見えませんが、統計表を見ると、StringBiulderの方が時間がかかっていないことがわかります。

メソッド concat() 高速です。ただし、複数の文字列の連結は、パフォーマンスの点で StringBuilder メソッドの方が高速です。

String と StringBuilder のソース・コードは、Sun JDK で入手できます。タンクボードを構築していることがわかります。メモリ割り当ては超高速です。

Remember:
  • ループ内で演算子 +を使用しないでください。
  • 複数の文字列を連結するには、常にStringBuilder を使用します。
  • 常にStringBuilder のサイズを初期化します。
参照:
Java - 文字列concat()メソッド
文字列連結:concat()対+ operator
Java - 文字列バッファappend()メソッド