CharSequence vs. Javaの文字列
1. 前書き
簡単に言えば、CharSequenceとStringはJavaの2つの異なる基本概念です。
この簡単な記事では、これらのタイプの違いと、それぞれをいつ使用するかを見ていきます。
2. CharSequence
CharSequenceは、文字のシーケンスを表すインターフェイスです。 このインターフェースでは、可変性は強制されません。 したがって、可変クラスと不変クラスの両方がこのインターフェースを実装します。
もちろん、インターフェースを直接インスタンス化することはできません。変数をインスタンス化するための実装が必要です。
CharSequence charSequence = "example";
ここで、charSequenceはString.でインスタンス化されます。他の実装をインスタンス化します。
CharSequence charSequence = new StringBuffer("example");
CharSequence charSequence = new StringBuilder("example");
3. String
Stringは、Javaの一連の文字です。 これは不変のクラスであり、Javaで最も頻繁に使用されるタイプの1つです。 このクラスは、CharSequence、Serializable、およびComparable<String>インターフェースを実装します。
両方のインスタンス化の下で、同じ内容のStringsを作成します。 ただし、これらは互いに等しくありません。
@Test
public void givenUsingString_whenInstantiatingString_thenWrong() {
CharSequence firstString = "example";
String secondString = "example";
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つの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を使用します。 ただし、場合によっては、StringBuilderとStringBufferの方が適切な場合があります。
CharSequenceおよびString.に関する詳細情報はJavaDocsにあります。
そして、いつものように、これらすべての例とコードスニペットの実装はover on Githubにあります。