leanmind logo leanmind text logo

Blog

TDD Avanzado

Las herramientas que se necesitan para aplicar TDD en el mundo real en cualquier proyecto.

Java, String, ‘+’, .concat() y eficiencia

Por Borja García

Trabajando en proyecto, @RubenZaGon, Francisco y yo, tuvimos la clásica duda de qué sería más óptimo para concatenar varios strings en cierta parte del código que actualmente lo hace mediante el operador +.

Este operador está mal visto, porque es sabido como cultura general, que tiene un peor rendimiento que recurrir a las clases StringBuilder o StringBuffer, (recordatorio de que StringBuffer es la versión thread-safe, ya que trabaja de forma síncrona), pero ¿qué hay del método .concat() de la propia clase String?

Como bien llegamos a razonar, un String en Java es un objeto inmutable, un value object. Esto quiere decir que, cualquier operación realizada sobre un objeto instanciado de esta clase, no modifica el propio objeto sino que nos devuelve una nueva instancia con el valor del resultado.

¿Afecta entonces al rendimiento usar un método de esta misma clase, que en principio debería devolver igualmente un nuevo objeto String?

Ambas formas de concatenar cadenas se comportan de forma similar pero tienen ligeras diferencias:

Esto es un ejemplo de como el comportamiento del operador +, al ser más simplista, tiende a tener un mejor rendimiento que el método .concat(), puesto que este último tiene en cuenta más situaciones en su definición.

Además, en lo personal, me parece más legible el operador + que el método .concat(). Aunque el nombre del método esté describiendo explícitamente la operación que se realiza, da la sensación de estar introduciendo ruido en forma de palabras en medio de las cadenas que estás intentando leer de forma continua.

¿Quiere decir esto que deberíamos usar siempre +? Evidentemente no, como todo es cuestión de contexto.

StringBuilder y StringBuffer siguen teniendo un mejor rendimiento cuando se necesita concatenar una gran cantidad de cadenas, y aún así, si quisiéramos rizar el rizo y ser estrictos con el rendimiento, no sería recomendable realizar este tipo de operaciones de forma masiva sobre objetos inmutables. Aunque hoy en día es muy barato el coste de instanciar objetos en memoria, todo se acaba traduciendo en mayor número de llamadas al Garbage Collector de Java, lo que no deja de ser una penalización en el tiempo de ejecución.

Publicado el 29/02/2024 por
Borja image

Borja García

¿Quieres más? te invitamos a suscribirte a nuestro boletín para avisarte cada vez que recopilemos contenido de calidad que compartir.

Si disfrutas leyendo nuestro blog, ¿imaginas lo divertido que sería trabajar con nosotros? ¿te gustaría?

Impulsamos el crecimiento profesional de tu equipo de developers