1. 序章

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

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

2. CharSequence

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

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

CharSequence charSequence = "baeldung";

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

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

3. 文字列

String は、Javaの文字のシーケンスです。 これは不変のクラスであり、Javaで最も頻繁に使用される型の1つです。 このクラスは、 CharSequence シリアル化可能 、 と同程度のインターフェイス。

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

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

    assertNotEquals(firstString, secondString);
}

4. CharSequence対。 文字列

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つの違いは、インターフェイスが組み込みの比較戦略を意味しないのに対し、クラスは同程度のインターフェース。

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

@Test
public void givenIdenticalCharSequences_whenCastToString_thenEqual() {
    CharSequence charSeq1 = "baeldung_1";
    CharSequence charSeq2 = "baeldung_2";
 
    assertTrue(charSeq1.toString().compareTo(charSeq2.toString()) > 0);
}

5. 結論

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

CharSequenceおよびString。に関する詳細については、JavaDocsを参照してください。

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