1前書き

簡単に言うと、

CharSequence



String

はJavaの2つの異なる基本概念です。

この簡単な記事では、これらの種類の違いとそれぞれを使用するタイミングについて説明します。


2

CharSequence



CharSequence

は、一連の文字を表すインタフェースです。

変更可能性は、このインタフェースによって強制されていません。したがって、可変クラスと不変クラスの両方がこのインタフェースを実装します。

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

CharSequence charSequence = "baeldung";

ここでは、

charSequence

が__Stringを使用してインスタンス化されています。

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


3

String



String

はJavaの文字のシーケンスです。これは不変クラスであり、Javaで最も頻繁に使用される型の1つです。このクラスは

CharSequence



Serializable

、および

Comparable <String>

インターフェースを実装します。

以下の両方のインスタンス化は、同じ内容の

Strings

を作成します。

しかし、それらは互いに同等ではありません。

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

    assertNotEquals(firstString, secondString);
}


4

CharSequence



String



CharSequence



String

の違いと共通点を比較しましょう。どちらも

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つの

__CharSequence


を比較するには、それらを


String

__にキャストし、次にそれらを比較します。

@Test
public void givenIdenticalCharSequences__whenCastToString__thenEqual() {
    CharSequence charSeq1 = "baeldung__1";
    CharSequence charSeq2 = "baeldung__2";

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


5結論

文字列に何を使うべきかわからないところでは、通常

String

を使います。ただし、場合によっては、

StringBuilder



StringBuffer

の方が適切な場合があります。

そして、いつものように、これらすべての例とコードスニペットの実装はhttps://github.com/eugenp/tutorials/tree/master/java-strings[over Github]にあります。