私は、インターネット上のJava Stringのスプライシングやその他の側面についての議論をよく見ていました。次のような初心者プログラマーへの提案でJava開発者を見ました。
+記号をスプライス文字列に使用しないでください。StringBufferまたはStringBuilderのappend()メソッドを使用して、弦をスプライスします。
ただし、 +サインが付いたひもをスプライスするのは本当に面倒です。ひもをスプライスするために +サインを使用することについて何も良いことはありませんか?
Java APIドキュメントの文字列クラスに関するコンテンツを調べることで、次のスニペットを見ることができます。
「Java言語は、文字列連結シンボル( "+")の特別なサポートを提供し、他のオブジェクトを文字列に変換します。文字列連結は、stringbuilder(またはstringbuffer)クラスとその追加方法を介して実装されます。文字列変換は、オブジェクトクラスによって定義され、Javaのすべてのクラスに継承される可能性があります。
このパッセージは、Javaでは、 +記号のスプライシング文字列を使用して、実際にStringBufferまたはStringBuilderとその追加方法によって実装されていることを明確に示しています。
Java APIドキュメントに加えて、ツールを使用してクラスファイルのバイトコードコマンドを表示して、上記の回答を取得することもできます。たとえば、コード:
public static void main(string [] args){string a = "hello";文字列b = "world"; string str = a + b + "!"; System.out.println(str);}ツールを介して対応するバイトコードを表示するコマンドは次のとおりです。
ByteCodeコマンドから、次のコードが書いたことが明確にわかります。
string str = a + b + "!";
それは次のような声明に変換されました。
string str = new StringBuilder(string.valueof(a))。append(b).append( "!")。toString();
それだけでなく、Javaコンパイラも比較的スマートなコンパイラです。 +記号のスプライシングがすべて文字列リテラルである場合、Javaコンパイラはコンピレーション中にそれを完全に文字列に変換します。例えば:
public static void main(string [] args){string str = "hello" + "world" + "、java!"; System.out.println(str);} Javaコンパイラは、この種の文字列がすべて文字通りに直接スプライブし、コンパイルされたときに完全な文字列に変換します。
文字列に +サインでスプライスされた変数がある場合でも、Javaコンパイラはフロントストリングリテラルを1つの文字列にマージします。
public static void main(string [] args){string java = "、java!"; string str = "hello" + "world" + java; System.out.println(str);}上記から、string str = str1 + str2 + str3 + str4のような操作では、一度に複数の文字列をスプライシングすることに問題はないことがわかります。
Javaでは、文字列オブジェクトは不変(不変)です。コードでは、特定の文字列オブジェクトの複数のエイリアスを作成できます。しかし、これらのエイリアスの参照は同じです。
たとえば、S1とS2は「droidyue.com」オブジェクトのエイリアスであり、エイリアスは実際のオブジェクトへの参照に保存されます。したがって、S1 = S2
string s1 = "driodyue.com"; string s2 = s1; system.out.println( "s1とs2の参照=" +(s1 == s2));
また、Javaでは、唯一の過負荷演算子は弦のスプライシングに関連しています。 +、+=。それに加えて、Javaデザイナーは他のオペレーターの過負荷を許可していません。
Javaでは、唯一のオーバーロードされた演算子は弦のスプライシングに関連しています。 +、+=。それに加えて、Javaデザイナーは他のオペレーターの過負荷を許可していません。
誰もが知っているように、Java 1.4の前に、弦のステッチを使用して文字列をスプライスできます。 Java 1.5から始めて、StringBuilderを使用して文字列をスプライスできます。 StringBufferとStringBuilderの主な違いは、StringBufferがスレッドセーフであり、文字列のマルチスレッド操作に適していることです。 StringBuilderはスレッドセーフであり、単一のスレッドの下で文字列を操作するのに適しています。ただし、文字列ステッチ操作のほとんどは単一のスレッドで実行されるため、StringBuilderを使用することはパフォーマンスに有益です。
Java 1.4の前に、コンパイラはStringBufferを使用して、 +サインのスプライス文字列で文字列を処理しました。 Java 1.5から始めて、コンパイラはStringBuilderを使用して、ほとんどの場合、 +サインのスプライスされた文字列を備えた文字列を処理しました。
JDK 1.4環境でコードを記述する場合、 +サインを使用して、複数の文字列が一度にスプライスされる上記の状況に対処することをお勧めします。このようにして、JDKが1.5以上にアップグレードされると、コンパイラは自動的にStringBuilderにスプライス文字列に変換し、それにより弦のスプライシングの効率を改善します。
もちろん、 +記号のスプライシング文字列の推奨される使用は、声明で複数の文字列をスプライシングする場合にのみ使用することに限定されます。複数のステートメントで文字列をスプライスする場合は、StringBufferまたはStringBuilderを使用することをお勧めします。例えば:
public static void main(string [] args){string java = "、java!";文字列str = ""; str += "hello"; str += "world"; str += java; System.out.println(str);}コンパイラのコンパイルされたバイトコマンドは次のとおりです。
上の写真から、各 +サインスプライシングステートメントが新しいStringBuilderオブジェクトを作成することを知ることができます。この状況は、サイクル条件下で特に顕著であり、その結果、比較的大きなパフォーマンス損失が発生します。したがって、複数のステートメントで文字列を処理するためにStringBufferまたはStringBuilderを使用することを強くお勧めします。
StringBuilderを使用してもたらされた最適化について
さらに、StringBufferまたはStringBuilderを使用する場合、次の方法を使用してパフォーマンスをさらに向上させることもできます(次のコードでは、StringBuilderを例に取ります。StringBufferはこれに似ています)。
1.最終取得した文字列の最大長を予測します。
StringBuilder内のChar配列のデフォルトの長さは16です。文字列を追加してこの長さを超えると、StringBuilderはニーズを満たすために内部配列容量を拡張します。このプロセスでは、StringBuilderが新しい容量の新しいchar配列を作成し、元の配列からデータを新しい配列にコピーします。最終的にスプライスされた文字列の最大長を大まかに予測できる場合、StringBuilderオブジェクトを作成するときに適切なサイズの初期容量を指定できます。たとえば、100文字を含む文字列を取得するには、スプライスする必要があります。次のコードを書くことができます。
stringbuilder sb = new StringBuilder(100); for(int i = 0; i <100; i ++){sb.append( 'a');} system.out.println(sb);実際の条件に応じてバランスを取って、初期容量に適したStringBuilderを作成してください。
2。個々の文字の場合、文字列タイプの代わりに可能な限りCHARタイプを使用します。
場合によっては、文字列の後に単一の文字を追加する必要があります(たとえば:a)、この時点で可能な限り使用する必要があります。
sb.append( 'a');
使用する代わりに:
sb.append( "a");