CharSequence frente a String en Java

1. Introducción

En pocas palabras, CharSequence y String son dos conceptos fundamentales diferentes en Java.

En este artículo rápido, veremos las diferencias entre estos tipos y cuándo usar cada uno.

2. CharSequence

CharSequence es una interfaz que representa una secuencia de caracteres. Esta interfaz no aplica la mutabilidad. Por lo tanto, tanto las clases mutables como las inmutables implementan esta interfaz.

Por supuesto, una interfaz no puede instanciarse directamente; necesita una implementación para instanciar una variable:

CharSequence charSequence = "baeldung";

Aquí, charSequence se instancia con un String. Creación de instancias de otras implementaciones:

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

3. Cadena

La cadena es una secuencia de caracteres en Java. Es una clase inmutable y uno de los tipos más utilizados en Java. Esta clase implementa las interfaces CharSequence , Serializable y Comparable .

A continuación, ambas instancias crean cadenas con el mismo contenido. Sin embargo, no son iguales entre sí:

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

4. CharSequence vs. String

Comparemos las diferencias y los puntos en común de CharSequence y String . Ambos residen en el mismo paquete llamado java.lang. , pero el primero es una interfaz y el segundo es una clase concreta. Además, la clase String es inmutable.

En el siguiente ejemplo, cada operación de suma crea otra instancia, aumenta la cantidad de datos almacenados y devuelve la cadena creada más recientemente :

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

Por otro lado, StringBuilder actualiza el String ya creado para contener el nuevo valor:

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

Otra diferencia es que la interfaz no implica una estrategia de comparación incorporada, mientras que la clase String implementa la interfaz Comparable .

Para comparar dos CharSequence s, podemos convertirlos en String s y luego compararlos:

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

5. Conclusión

Usualmente usamos String en los lugares donde no estamos seguros de qué usar para las secuencias de caracteres. Sin embargo, en algunos casos, StringBuilder y StringBuffer pueden ser más apropiados.

Puede encontrar más información en JavaDocs sobre CharSequence y String.

Y, como siempre, la implementación de todos estos ejemplos y fragmentos de código se puede encontrar en Github.