Concatenación de cadenas en Java

1. Introducción

Java proporciona una cantidad sustancial de métodos y clases dedicados a concatenar cadenas.

En este tutorial, profundizaremos en varios de ellos, así como también describiremos algunos errores comunes y malas prácticas.

2. StringBuilder

Primero está el humilde StringBuilder. Esta clase proporciona una matriz de String construcción de servicios públicos que hace fácil el trabajo de Cadena manipulación.

Construyamos un ejemplo rápido de concatenación de cadenas usando la clase StringBuilder :

StringBuilder stringBuilder = new StringBuilder(100); stringBuilder.append("Baeldung"); stringBuilder.append(" is"); stringBuilder.append(" awesome"); assertEquals("Baeldung is awesome", stringBuilder.toString());

Internamente, StringBuilder mantiene una matriz mutable de caracteres. En nuestra muestra de código, hemos declarado que esto tiene un tamaño inicial de 100 a través del constructor StringBuilder . Debido a esta declaración de tamaño, StringBuilder puede ser una forma muy eficiente de concatenar cadenas .

También vale la pena señalar que la clase StringBuffer es la versión sincronizada de StringBuilder .

Aunque la sincronización es a menudo sinónimo de seguridad de subprocesos, no se recomienda su uso en aplicaciones multiproceso debido al patrón de construcción de StringBuffer . Si bien las llamadas individuales a un método sincronizado son seguras para subprocesos, las llamadas múltiples no lo son.

3. Operador de adición

El siguiente es el operador de suma (+). Este es el mismo operador que da como resultado la suma de números y se sobrecarga para concatenar cuando se aplica a Strings.

Echemos un vistazo rápido a cómo funciona esto:

String myString = "The " + "quick " + "brown " + "fox..."; assertEquals("The quick brown fox...", myString);

A primera vista, esto puede parecer mucho más conciso que la opción StringBuilder . Sin embargo, cuando se compila el código fuente, el símbolo + se traduce en cadenas de llamadas StringBuilder.append () . Debido a esto, mezclar el StringBuilder y el método de concatenación + se considera una mala práctica .

Además, se debe evitar la concatenación de cadenas con el operador + dentro de un bucle. Dado que el objeto String es inmutable, cada llamada a la concatenación dará como resultado la creación de un nuevo objeto String .

4. Métodos de cadena

La propia clase String proporciona una gran cantidad de métodos para concatenar Strings.

4.1. String.concat

Como era de esperar, el método String.concat es nuestro primer puerto de llamada cuando intentamos concatenar objetos String . Este método devuelve un objeto String , por lo que encadenar el método es una característica útil.

String myString = "Both".concat(" fickle") .concat(" dwarves") .concat(" jinx") .concat(" my") .concat(" pig") .concat(" quiz"); assertEquals("Both fickle dwarves jinx my pig quiz", myString);

En este ejemplo, nuestra cadena se inicia con un literal String , luego el método concat nos permite encadenar las llamadas para agregar más Strings .

4.2. String.format

El siguiente es el método String.format , que nos permite inyectar una variedad de objetos Java en una plantilla String .

La firma del método String.format toma una sola cadena que denota nuestra plantilla . Esta plantilla contiene caracteres '%' para representar dónde se encuentran los distintos objetos.debe colocarse dentro de él.

Una vez que se declara nuestra plantilla, toma una matriz de objetos varargs que se inyecta en la plantilla.

Veamos cómo funciona esto con un ejemplo rápido:

String myString = String.format("%s %s %.2f %s %s, %s...", "I", "ate", 2.5056302, "blueberry", "pies", "oops"); assertEquals("I ate 2.51 blueberry pies, oops...", myString);

Como podemos ver arriba, el método ha inyectado nuestras cadenas en el formato correcto.

4.3. String.join (Java 8+)

Si nuestra aplicación se ejecuta en Java 8 o superior , podemos aprovechar el método String.join . Con esto, podemos unir una matriz de cadenas con un delimitador común , asegurando que no se pierdan espacios.

String[] strings = {"I'm", "running", "out", "of", "pangrams!"}; String myString = String.join(" ", strings); assertEquals("I'm running out of pangrams!", myString); 

Una gran ventaja de este método es no tener que preocuparse por el delimitador entre nuestras cadenas.

5. StringJoiner (Java 8+)

StringJoiner abstrae toda la funcionalidad String.join en una clase fácil de usar. El constructor toma un delimitador, con un prefijo y un sufijo opcionales . Podemos agregar cadenas utilizando el método add bien nombrado .

StringJoiner fruitJoiner = new StringJoiner(", "); fruitJoiner.add("Apples"); fruitJoiner.add("Oranges"); fruitJoiner.add("Bananas"); assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString());

Al usar esta clase, en lugar del método String.join , podemos agregar Strings mientras se ejecuta el programa ; ¡No es necesario crear la matriz primero!

Consulte nuestro artículo sobre StringJoiner para obtener más información y ejemplos.

6. Arrays.toString

Sobre el tema de las matrices, la clase Array también contiene un práctico método toString que formatea muy bien una matriz de objetos. Las matrices. El método toString también llama al método toString de cualquier objeto adjunto, por lo que debemos asegurarnos de tener uno definido.

String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; String toString = Arrays.toString(myFavouriteLanguages); assertEquals("[Java, JavaScript, Python]", toString);

Desafortunadamente, Arrays. El método toString no es personalizable y solo genera una cadena encerrada entre corchetes.

7. Collectors.joining (Java 8+)

Finalmente, echemos un vistazo al método Collectors.joining que nos permite canalizar la salida de un Stream en una sola String.

List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); assertEquals("Shark, Panda, Armadillo", animalString);

El uso de transmisiones desbloquea todas las funciones asociadas con la API de Java 8 Stream , como filtrado, mapeo, iteración y más.

8. Conclusión

En este artículo, hemos profundizado en la multitud de clases y métodos utilizados para concatenar cadenasen el lenguaje Java.

Como siempre, el código fuente está disponible en GitHub.