Javaでの文字列の連結
1. 序章
Javaは、連結文字列専用のかなりの数のメソッドとクラスを提供します。
このチュートリアルでは、それらのいくつかに飛び込み、いくつかの一般的な落とし穴と悪い習慣の概要を説明します。
2. StringBuilder
最初は謙虚です
StringBuilder クラスを使用して、String連結の簡単な例を作成しましょう。
StringBuilder stringBuilder = new StringBuilder(100);
stringBuilder.append("Baeldung");
stringBuilder.append(" is");
stringBuilder.append(" awesome");
assertEquals("Baeldung is awesome", stringBuilder.toString());
内部的には、 StringBuilderは文字の可変配列を維持します。コードサンプルでは、StringBuilderコンストラクターを介して初期サイズが100であると宣言しています。 このサイズ宣言により、StringBuilderは文字列を連結するための非常に効率的な方法になります。
また、注目に値するのは StringBufferクラスは、の同期バージョンです。
多くの場合、同期はスレッドセーフと同義ですが、 StringBufferのビルダーパターンのため、マルチスレッドアプリケーションでの使用はお勧めしません。 同期されたメソッドへの個々の呼び出しはスレッドセーフですが、複数の呼び出しはではありません。
3. 加算演算子
次は足し算演算子(+)です。 これは、数値が加算されるのと同じ演算子であり、文字列に適用するとオーバーロードされて連結されます。
これがどのように機能するかを簡単に見てみましょう。
String myString = "The " + "quick " + "brown " + "fox...";
assertEquals("The quick brown fox...", myString);
一見すると、これはStringBuilderオプションよりもはるかに簡潔に見えるかもしれません。 ただし、ソースコードをコンパイルすると、 +記号はStringBuilder.append()呼び出しのチェーンに変換されます。このため、StringBuilderと+メソッドの連結はになります。悪い習慣と見なされた。
さらに、ループ内で+演算子を使用したString連結は避ける必要があります。 String オブジェクトは不変であるため、連結を呼び出すたびに、新しいStringオブジェクトが作成されます。
4. 文字列メソッド
String クラス自体は、Stringsを連結するためのメソッドのホスト全体を提供します。
4.1. String.concat
当然のことながら、 String.concat メソッドは、Stringオブジェクトを連結しようとするときの最初の呼び出しポートです。 このメソッドはStringオブジェクトを返すため、メソッドをチェーン化することは便利な機能です。
String myString = "Both".concat(" fickle")
.concat(" dwarves")
.concat(" jinx")
.concat(" my")
.concat(" pig")
.concat(" quiz");
assertEquals("Both fickle dwarves jinx my pig quiz", myString);
この例では、チェーンは String リテラルで開始され、 concat メソッドを使用すると、呼び出しをチェーンしてさらにStringsを追加できます。
4.2. String.format
次は、 String.formatメソッドです。これにより、さまざまなJavaオブジェクトをStringテンプレートに挿入できます。
String.format メソッドの署名は、テンプレートを示す単一の文字列を取ります。 このテンプレートには、さまざまなオブジェクトを配置する場所を表す’%’文字が含まれています。
テンプレートが宣言されると、はvarargsオブジェクト配列を取得します。この配列はテンプレートに挿入されます。
これがどのように機能するかを簡単な例で見てみましょう。
String myString = String.format("%s %s %.2f %s %s, %s...", "I",
"ate",
2.5056302,
"blueberry",
"pies",
"oops");
assertEquals("I ate 2.51 blueberry pies, oops...", myString);
上記のように、このメソッドは文字列を正しい形式に挿入しました。
4.3. String.join (Java 8+)
アプリケーションがJava8 以上で実行されている場合は、String.joinメソッドを利用できます。 これにより、共通の区切り文字を使用して文字列の配列を結合し、スペースを逃さないようにすることができます。
String[] strings = {"I'm", "running", "out", "of", "pangrams!"};
String myString = String.join(" ", strings);
assertEquals("I'm running out of pangrams!", myString);
この方法の大きな利点は、文字列間の区切り文字について心配する必要がないことです。
5. StringJoiner (Java 8+)
StringJoiner は、すべてのString.join機能を使いやすいクラスに抽象化します。 コンストラクターは、オプションのプレフィックスとサフィックスを含む区切り文字を取ります。 よく名付けられたaddメソッドを使用して、Stringsを追加できます。
StringJoiner fruitJoiner = new StringJoiner(", ");
fruitJoiner.add("Apples");
fruitJoiner.add("Oranges");
fruitJoiner.add("Bananas");
assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());
String.join メソッドの代わりにこのクラスを使用することで、プログラムの実行時に文字列を追加できます。 最初にアレイを作成する必要はありません!
詳細と例については、StringJoinerに関するの記事をご覧ください。
6. Arrays.toString
配列のトピックについては、 Arrayクラスには、オブジェクトの配列を適切にフォーマットする便利なtoStringメソッドも含まれています。配列。
String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"};
String toString = Arrays.toString(myFavouriteLanguages);
assertEquals("[Java, JavaScript, Python]", toString);
残念ながら、Arrays。 toString メソッドはカスタマイズできず、のみが角かっこで囲まれた文字列を出力します。
7. Collectors.joining (Java 8+)
最後に、 Collectors.joining メソッドを見てみましょう。を使用すると、ストリームの出力を1つの文字列にまとめることができます。
List<String> awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo");
String animalString = awesomeAnimals.stream().collect(Collectors.joining(", "));
assertEquals("Shark, Panda, Armadillo", animalString);
ストリームを使用すると、フィルタリング、マッピング、反復など、Java8ストリームAPIに関連するすべての機能のロックが解除されます。
8. 要約
この記事では、で、Java言語で文字列を連結するために使用される多数のクラスとメソッドについて詳しく説明しました。
いつものように、ソースコードはGitHubでから入手できます。