1. 序章

文字列ベースの値と操作は日常の開発では非常に一般的であり、Java開発者はそれらを処理できる必要があります。

このチュートリアルでは、一般的なString操作の簡単なチートシートを提供します。

さらに、 equals と「==」の違い、および StringUtils#isBlank と#isEmpty。の違いについても説明します。

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

char は、Javaの1文字を表します。 ただし、ほとんどの場合、String。が必要です。

それでは、 charsをString s に変換することから始めましょう。

String toStringWithConcatenation(final char c) {
    return String.valueOf(c);
}

3. 文字列の追加

もう1つの頻繁に必要な操作は、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);
}

Stringchar[] をバッキングデータ構造として使用するため、インデックスはゼロから始まります。

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;
}

もちろん、 int は4つの符号なしバイトであり、 char は2つの符号なしバイトであるため、有効な文字値を使用していることを確認する必要があります。

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

一部の文字、最も一般的には空白を削除する必要がある場合があります。 良い方法は、replaceAllメソッドを正規表現で使用することです:

String removeWhiteSpace(final String text) {
    return text.replaceAll("\\s+", "");
}

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

もう1つの一般的な使用例は、ある種の Collection があり、それから文字列を作成したい場合です。

<T> String fromCollection(final Collection<T> collection) { 
   return collection.stream().map(Objects::toString).collect(Collectors.joining(", "));
}

Collectors.joining では、プレフィックスまたはサフィックスを指定できることに注意してください。

8. 文字列の分割

または、 split メソッドを使用して、区切り文字で文字列を分割することもできます。

String[] splitByRegExPipe(final String text) {
   return text.split("\\|");
}

ここでも、ここでは正規表現を使用しており、今回はパイプで分割します。 特殊文字を使用したいので、それをエスケープする必要があります

もう1つの可能性は、Patternクラスを使用することです。

String[] splitByPatternPipe(final String text) {
    return text.split(Pattern.quote("|"));
}

9. すべての文字をストリームとして処理する

詳細な処理の場合、文字列をIntStreamに変換できます。

IntStream getStream(final String text) {
    return text.chars();
}

10. 参照の平等と価値の平等

文字列はプリミティブ型のように見えますが、そうではありません。

したがって、参照の同等性と値の同等性を区別する必要があります。 参照の平等は常に値の平等を意味しますが、一般的にはその逆ではありません。  前者は「==」操作でチェックし、後者は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");
}

リテラルが文字列プールインターンされていることに注意してください。 したがって、コンパイラーはそれらを同じ参照に最適化できる場合があります。

@Test
public void whenTheCompileCanBuildUpAString_thenWeGetTheSameReference() {
    assertTrue("Literals are concatenated by the compiler", "Test" == "Te"+"st");
}

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

isBlankisEmptyには微妙な違いがあります。

文字列が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. 結論

文字列は、あらゆる種類のアプリケーションのコアタイプです。 このチュートリアルでは、一般的なシナリオでいくつかの重要な操作を学びました。

さらに、より詳細な参考資料を紹介しました。

最後に、すべての例を含む完全なコードは、GitHubリポジトリで入手できます。