CharSequence versus String in Java

1. Inleiding

Simpel gezegd, CharSequence en Draad zijn twee verschillende fundamentele concepten in Java.

In dit korte artikel gaan we kijken naar de verschillen tussen deze typen en wanneer we ze allemaal moeten gebruiken.

2. CharSequence

CharSequence is een interface die een reeks karakters vertegenwoordigt. Veranderbaarheid wordt niet afgedwongen door deze interface. Daarom implementeren zowel veranderlijke als onveranderlijke klassen deze interface.

Natuurlijk kan een interface niet rechtstreeks worden geïnstantieerd; het heeft een implementatie nodig om een ​​variabele te instantiëren:

CharSequence charSequence = "baeldung";

Hier, charSequence wordt geïnstantieerd met een Draad. Instanties van andere implementaties:

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

3. Draad

Draad is een reeks tekens in Java. Het is een onveranderlijke klasse en een van de meest gebruikte typen in Java. Deze klasse implementeert het CharSequence, Serialiseerbaar, en Vergelijkbaar interfaces.

Hieronder creëren beide instantiaties Snaren met dezelfde inhoud. Ze zijn echter niet gelijk aan elkaar:

@Test openbare ongeldig gegevenUsingString_whenInstantiatingString_thenWrong () {CharSequence firstString = "baeldung"; String secondString = "baeldung"; assertNotEquals (firstString, secondString); }

4. CharSequence vs. Draad

Laten we de verschillen en overeenkomsten van CharSequence en Draad. Ze bevinden zich allebei in hetzelfde pakket met de naam java.lang., maar de eerste is een interface en de laatste is een concrete klasse. Bovendien is de Draad klasse is onveranderlijk.

In het volgende voorbeeld maakt elke sombewerking een andere instantie, verhoogt de hoeveelheid opgeslagen gegevens en retourneert de laatst gemaakte Draad:

@Test openbare ongeldig gegevenString_whenAppended_thenUnmodified () {String test = "a"; int firstAddressOfTest = System.identityHashCode (test); test + = "b"; int secondAddressOfTest = System.identityHashCode (test); assertNotEquals (firstAddressOfTest, secondAddressOfTest); }

Aan de andere kant, StringBuilder werkt het reeds gemaakte Draad om de nieuwe waarde vast te houden:

@Test openbare leegte gegevenStringBuilder_whenAppended_thenModified () {StringBuilder test = nieuwe StringBuilder (); test.append ("a"); int firstAddressOfTest = System.identityHashCode (test); test.append ("b"); int secondAddressOfTest = System.identityHashCode (test); assertEquals (firstAddressOfTest, secondAddressOfTest); }

Een ander verschil is dat de interface geen ingebouwde vergelijkingsstrategie impliceert, terwijl de Draad class implementeert het Vergelijkbaar koppel.

Om twee te vergelijken CharSequences, kunnen we ze casten Draads vervolgens ze vervolgens vergelijken:

@Test openbare ongeldig gegevenIdenticalCharSequences_whenCastToString_thenEqual () {CharSequence charSeq1 = "baeldung_1"; CharSequence charSeq2 = "baeldung_2"; assertTrue (charSeq1.toString (). CompareTo (charSeq2.toString ())> 0); }

5. Conclusie

We gebruiken meestal Draad op de plaatsen waar we niet zeker weten wat we moeten gebruiken voor tekenreeksen. In sommige gevallen StringBuilder en StringBuffer kan geschikter zijn.

U kunt meer informatie vinden in JavaDocs over CharSequence en Draad.

En, zoals altijd, is de implementatie van al deze voorbeelden en codefragmenten te vinden op Github.