CharSequence vs. String in Java

Zeichenfolge vs. Zeichenfolge in Java

1. Einführung

Einfach ausgedrückt sindCharSequence undString zwei verschiedene grundlegende Konzepte in Java.

In diesem kurzen Artikel werden wir uns die Unterschiede zwischen diesen Typen und den jeweiligen Verwendungszweck ansehen.

2. CharSequence

CharSequence ist eine Schnittstelle, die eine Folge von Zeichen darstellt. Die Änderbarkeit wird von dieser Schnittstelle nicht erzwungen. Daher implementieren sowohl veränderbare als auch unveränderbare Klassen diese Schnittstelle.

Natürlich kann eine Schnittstelle nicht direkt instanziiert werden. Es benötigt eine Implementierung, um eine Variable zu instanziieren:

CharSequence charSequence = "example";

Hier wirdcharSequence mitString. instanziiert. Andere Implementierungen werden instanziiert:

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

3. String

String ist eine Folge von Zeichen in Java. Es ist eine unveränderliche Klasse und einer der am häufigsten verwendeten Typen in Java. Diese Klasse implementiert die SchnittstellenCharSequence,Serializable undComparable<String>.

Unter beiden Instanziierungen werdenStrings mit demselben Inhalt erstellt. Sie sind jedoch nicht gleich:

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

    assertNotEquals(firstString, secondString);
}

4. CharSequence vs. String

Vergleichen wir die Unterschiede und Gemeinsamkeiten vonCharSequence undString. Sie befinden sich beide im selben Paket mit dem Namenjava.lang., aber das erstere ist eine Schnittstelle und das letztere ist eine konkrete Klasse. Darüber hinaus ist die KlasseStringunveränderlich.

Im folgenden Beispiel erstellt jede Summenoperation eine andere Instanz, erhöht die gespeicherte Datenmenge und gibt die zuletzt erstelltenString: zurück

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

    assertNotEquals(firstAddressOfTest, secondAddressOfTest);
}

Andererseits aktualisiertStringBuilder die bereits erstelltenString, um den neuen Wert zu speichern:

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

Ein weiterer Unterschied besteht darin, dass die Schnittstelle keine integrierte Vergleichsstrategie impliziert, während die KlasseStringdie SchnittstelleComparable<String>implementiert.

Um zweiCharSequences zu vergleichen, können wir sie inStrings umwandeln und anschließend vergleichen:

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

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

5. Fazit

Wir verwenden normalerweiseString an Stellen, an denen wir nicht sicher sind, was wir für Zeichenfolgen verwenden sollen. In einigen Fällen können jedochStringBuilder undStringBuffer geeigneter sein.

Weitere Informationen zuCharSequence undString. finden Sie in JavaDocs

Und wie immer kann die Implementierung all dieser Beispiele und Codefragmente inover on Github gefunden werden.