CharSequence e String in Java

1. Introduzione

In poche parole, CharSequence e String sono due concetti fondamentali diversi in Java.

In questo breve articolo, daremo un'occhiata alle differenze tra questi tipi e quando usarli.

2. CharSequence

CharSequence è un'interfaccia che rappresenta una sequenza di caratteri. La mutabilità non viene applicata da questa interfaccia. Pertanto, entrambe le classi mutabili e immutabili implementano questa interfaccia.

Naturalmente, un'interfaccia non può essere istanziata direttamente; ha bisogno di un'implementazione per istanziare una variabile:

CharSequence charSequence = "baeldung";

Qui, charSequence viene istanziato con una stringa. Istanziare altre implementazioni:

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

3. Stringa

La stringa è una sequenza di caratteri in Java. È una classe immutabile e uno dei tipi più utilizzati in Java. Questa classe implementa le interfacce CharSequence , Serializable e Comparable .

Sotto entrambe le istanze vengono create stringhe con lo stesso contenuto. Tuttavia, non sono uguali tra loro:

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

4. CharSequence vs String

Confrontiamo le differenze e le caratteristiche comuni di CharSequence e String . Entrambi risiedono nello stesso pacchetto denominato java.lang. , ma la prima è un'interfaccia e la seconda è una classe concreta. Inoltre, la classe String è immutabile.

Nell'esempio seguente, ogni operazione di somma crea un'altra istanza, aumenta la quantità di dati archiviati e restituisce la stringa creata più di recente :

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

D'altra parte, StringBuilder aggiorna la stringa già creata per contenere il nuovo valore:

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

Un'altra differenza è che l'interfaccia non implica una strategia di confronto incorporata, mentre la classe String implementa l' interfaccia Comparable .

Per confrontare due CharSequence , possiamo lanciarli su String e successivamente confrontarli:

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

5. conclusione

Di solito usiamo String nei punti in cui non siamo sicuri di cosa usare per le sequenze di caratteri. Tuttavia, in alcuni casi, StringBuilder e StringBuffer possono essere più appropriati.

Puoi trovare maggiori informazioni in JavaDocs su CharSequence e String.

E, come sempre, l'implementazione di tutti questi esempi e frammenti di codice può essere trovata su Github.