Javaの一般的な文字列操作

1. 前書き

文字列ベースの値と操作は日常の開発で非常に一般的であり、Java開発者はそれらを処理できる必要があります。
このチュートリアルでは、一般的な_String_操作の簡単なチートシートを提供します。
さらに、_equals_ and“ ==”と__StringUtils#isBlank __と#_isEmpty._の違いについても説明します。

2. 文字を文字列に変換する

_char_は、Javaの1文字を表します。 しかし、ほとんどの場合、_String._が必要です。
それでは、__ char__sを__String__s _:_に変換するところから始めましょう。
String toStringWithConcatenation(final char c) {
    return String.valueOf(c);
}

3. 文字列を追加する

別の頻繁に必要な操作は、_char_のような他の値で文字列を追加することです:
String appendWithConcatenation(final String prefix, final char c) {
    return prefix + c;
}
_StringBuilder_を使用して他の基本タイプも追加できます**:**
String appendWithStringBuilder(final String prefix, final char c) {
    return new StringBuilder(prefix).append(c).toString();
}

4. インデックスによるキャラクターの取得

文字列から1文字を抽出する必要がある場合、APIは必要なすべてを提供します。
char getCharacterByIndex(final String text, final int index) {
    return text.charAt(index);
}
_String_は_char [] _をバッキングデータ構造として使用するため、*インデックスはゼロから始まります*。

5. ASCII値の処理

以下をキャストすることで、_char_とその数値表現(ASCII)を簡単に切り替えることができます。
int asciiValue(final char character) {
    return (int) character;
}

char fromAsciiValue(final int value) {
    Assert.isTrue(value >= 0 && value < 65536, "value is not a valid character");
    return (char) value;
}
もちろん、an _int_は4バイトの符号なしバイトであり、a _char_は2バイトの符号なしバイトなので、有効な文字値を使用していることを確認する必要があります。

6. すべての空白を削除する

時々、いくつかの文字、最も一般的には空白を取り除く必要があります。 *良い方法は、link:/regular-expressions-java [正規表現]:*で_replaceAll_メソッドを使用することです
String removeWhiteSpace(final String text) {
    return text.replaceAll("\\s+", "");
}

7. コレクションを文字列に結合する

別の一般的な使用例は、何らかの種類の_Collection_があり、それから文字列を作成する場合です。
<T> String fromCollection(final Collection<T> collection) {
   return collection.stream().map(Objects::toString).collect(Collectors.joining(", "));
}
_Collectors.joining_ではlink:/java-8-collectors [プレフィックスまたはサフィックスを指定]が許可されていることに注意してください。

8. 文字列を分割する

または、_split_メソッドを使用して、区切り文字で文字列を分割できます。
String[] splitByRegExPipe(final String text) {
   return text.split("\\|");
}
繰り返しますが、ここでは正規表現を使用していますが、今回はパイプで分割します。 特殊文字を使用するため、https://www.baeldung.com/java-regexp-escape-char [エスケープする必要があります]。
別の可能性は、_Pattern_クラスを使用することです:
String[] splitByPatternPipe(final String text) {
    return text.split(Pattern.quote("|"));
}

9. すべてのキャラクターをストリームとして処理する

詳細な処理の場合、文字列を_https://www.baeldung.com/java-string-to-stream [IntStream] _に変換できます。
IntStream getStream(final String text) {
    return text.chars();
}

10. 参照平等と価値平等

文字列は* typeのように見えますが、そうではありません。*
したがって、参照の等価性と値の等価性を区別する必要があります。 参照の平等は常に値の平等を意味しますが、一般的にはその逆ではありません。 最初は、「==」操作で確認し、後者は_equals_メソッドで確認します。
@Test
public void whenUsingEquals_thenWeCheckForTheSameValue() {
    assertTrue("Values are equal", new String("Test").equals("Test"));
}

@Test
public void whenUsingEqualsSign_thenWeCheckForReferenceEquality() {
    assertFalse("References are not equal", new String("Test") == "Test");
}
リテラルはlink:/java-string-pool [文字列プールにインターン]であることに注意してください。 したがって、コンパイラーは、それらを同じ参照に最適化できる場合があります。
@Test
public void whenTheCompileCanBuildUpAString_thenWeGetTheSameReference() {
    assertTrue("Literals are concatenated by the compiler", "Test" == "Te"+"st");
}

11. 空白文字列と 空の文字列

_isBlank_と_isEmpty_には微妙な違いがあります。
文字列は、_null_または長さがゼロの場合は空です。 *一方、文字列がnullの場合、または空白文字のみを含む場合、文字列は空白です:*
@Test
public void whenUsingIsEmpty_thenWeCheckForNullorLengthZero() {
    assertTrue("null is empty", isEmpty(null));
    assertTrue("nothing is empty", isEmpty(""));
    assertFalse("whitespace is not empty", isEmpty(" "));
    assertFalse("whitespace is not empty", isEmpty("\n"));
    assertFalse("whitespace is not empty", isEmpty("\t"));
    assertFalse("text is not empty", isEmpty("Anything!"));
}

@Test
public void whenUsingIsBlank_thenWeCheckForNullorOnlyContainingWhitespace() {
    assertTrue("null is blank", isBlank(null));
    assertTrue("nothing is blank", isBlank(""));
    assertTrue("whitespace is blank", isBlank("\t\t \t\n\r"));
    assertFalse("test is not blank", isBlank("Anything!"));
}

12. 結論

文字列は、あらゆる種類のアプリケーションのコアタイプです。 このチュートリアルでは、一般的なシナリオでいくつかの重要な操作を学びました。
さらに、より詳細なリファレンスへの指示を示しました。
最後に、すべてのサンプルを含む完全なコードは、https://github.com/eugenp/tutorials/tree/master/java-strings-ops [GitHub repository]で入手できます。