CharSequence vs. String in Java

1. Einleitung

Einfach ausgedrückt sind CharSequence und String 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 Veränderbarkeit wird von dieser Schnittstelle nicht erzwungen. Daher implementieren sowohl veränderbare als auch unveränderliche Klassen diese Schnittstelle.

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

CharSequence charSequence = "baeldung";

Hier wird charSequence mit einem String instanziiert . Instanziieren anderer Implementierungen:

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

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 CharSequence , Serializable und vergleichbare Schnittstellen.

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

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

4. CharSequence vs. String

Vergleichen wir die Unterschiede und Gemeinsamkeiten von CharSequence und String . Beide befinden sich im selben Paket mit dem Namen java.lang. , aber das erstere ist eine Schnittstelle und das letztere ist eine konkrete Klasse. Darüber hinaus ist die String- Klasse unveränderlich.

Im folgenden Beispiel erstellt jede Summenoperation eine andere Instanz, erhöht die gespeicherte Datenmenge und gibt den zuletzt erstellten String 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); }

Auf der anderen Seite aktualisiert StringBuilder den bereits erstellten String , 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 String- Klasse die Schnittstelle Comparable implementiert.

Um zwei CharSequence s zu vergleichen , können wir sie in String s umwandeln und anschließend vergleichen:

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

5. Schlussfolgerung

Wir verwenden String normalerweise an Stellen, an denen wir nicht sicher sind, was wir für Zeichenfolgen verwenden sollen. In einigen Fällen können StringBuilder und StringBuffer jedoch besser geeignet sein.

Weitere Informationen zu CharSequence und String finden Sie in JavaDocs .

Und wie immer finden Sie die Implementierung all dieser Beispiele und Codefragmente auf Github.