CharSequenceとJavaの文字列

CharSequence vs. Javaの文字列

1. 前書き

簡単に言えば、CharSequenceStringはJavaの2つの異なる基本概念です。

この簡単な記事では、これらのタイプの違いと、それぞれをいつ使用するかを見ていきます。

2. CharSequence

CharSequenceは、文字のシーケンスを表すインターフェイスです。 このインターフェースでは、可変性は強制されません。 したがって、可変クラスと不変クラスの両方がこのインターフェースを実装します。

もちろん、インターフェースを直接インスタンス化することはできません。変数をインスタンス化するための実装が必要です。

CharSequence charSequence = "example";

ここで、charSequenceString.でインスタンス化されます。他の実装をインスタンス化します。

CharSequence charSequence = new StringBuffer("example");
CharSequence charSequence = new StringBuilder("example");

3. String

Stringは、Javaの一連の文字です。 これは不変のクラスであり、Javaで最も頻繁に使用されるタイプの1つです。 このクラスは、CharSequenceSerializable、およびComparable<String>インターフェースを実装します。

両方のインスタンス化の下で、同じ内容のStringsを作成します。 ただし、これらは互いに等しくありません。

@Test
public void givenUsingString_whenInstantiatingString_thenWrong() {
    CharSequence firstString = "example";
    String secondString = "example";

    assertNotEquals(firstString, secondString);
}

4. CharSequence対。 String

CharSequenceStringの違いと共通点を比較してみましょう。 これらは両方ともjava.lang.という名前の同じパッケージにありますが、前者はインターフェースであり、後者は具象クラスです。 さらに、Stringクラスは不変です。

次の例では、各合計操作で別のインスタンスが作成され、保存されるデータの量が増え、最後に作成されたString:が返されます。

@Test
public void givenString_whenAppended_thenUnmodified() {
    String test = "a";
    int firstAddressOfTest = System.identityHashCode(test);
    test += "b";
    int secondAddressOfTest = System.identityHashCode(test);

    assertNotEquals(firstAddressOfTest, secondAddressOfTest);
}

一方、StringBuilderは、作成済みのStringを更新して、新しい値を保持します。

@Test
public void givenStringBuilder_whenAppended_thenModified() {
    StringBuilder test = new StringBuilder();
    test.append("a");
    int firstAddressOfTest = System.identityHashCode(test);
    test.append("b");
    int secondAddressOfTest = System.identityHashCode(test);

    assertEquals(firstAddressOfTest, secondAddressOfTest);
}

もう1つの違いは、インターフェイスが組み込みの比較戦略を意味しないのに対し、StringクラスはComparable<String>インターフェイスを実装することです。

2つのCharSequencesを比較するには、それらをStringsにキャストしてから、次のように比較します。

@Test
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
    CharSequence charSeq1 = "example_1";
    CharSequence charSeq2 = "example_2";

    assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);
}

5. 結論

通常、charシーケンスに何を使用するかわからない場所では、Stringを使用します。 ただし、場合によっては、StringBuilderStringBufferの方が適切な場合があります。

CharSequenceおよびString.に関する詳細情報はJavaDocsにあります。

そして、いつものように、これらすべての例とコードスニペットの実装はover on Githubにあります。