template numeros metodo concatenar como caracteres java stringbuilder string-concatenation

numeros - string en java



Constructor de cadenas vs concatenación de cadenas (2)

En su ejemplo trivial, ninguno porque el compilador usa StringBuilder para hacer la concatenación de cadenas. Sin embargo, si la concatenación ocurrió en un bucle, el compilador podría crear varios objetos StringBuilder y String . Por ejemplo:

String s= "" ; for(int i= 0 ; i < 10 ; i++ ) s+= "a" ;

Cada vez que se ejecuta la línea 3 anterior, se crea un objeto StringBuilder , se adjunta el contenido de s , se agrega "a", y luego se convierte en un StringBuilder que se asigna de nuevo a s . Un total de 10 StringBuilder y 10 String .

A la inversa, en

StringBuilder sb= new StringBuilder() ; for(int i= 0 ; i < 10 ; i++ ) sb.append( "a" ); String s= sb.toString() ;

Solo se crean 1 StringBuilder y 1 String .

La razón principal de esto es que el compilador no puede ser lo suficientemente inteligente como para entender que el primer bucle es equivalente al segundo y generar un código más eficiente (byte). En casos más complejos, es imposible incluso para el compilador más inteligente saberlo. Si necesita absolutamente esta optimización, debe introducirla manualmente utilizando StringBuilder s explícitamente.

Esta pregunta ya tiene una respuesta aquí:

¿Cuál es el beneficio y la compensación de usar un generador de cadenas sobre la concatenación de cadenas puras?

new StringBuilder(32).append(str1) .append(" test: ") .append(val) .append(" is changed") .toString();

vs decir

str1 + " test: " + val + " is changed".

str1 es una cadena de 10 caracteres aleatorios. str2 es una cadena aleatoria de 8 caracteres.


La respuesta rápida es el rendimiento: cuando utiliza clases de cadenas nativas, opera cadenas inmutables, lo que significa que cuando escribe

String line = "java"; String sufix = " is awesome"; line = line + sufix;

creará dos cadenas "java" y "es impresionante", que crear una nueva tercera cadena "java es increíble" de las dos anteriores ("java" y "es increíble") que luego serán eliminadas por un recolector de basura ( porque ya no se utilizan en la aplicación). Esa es una solución lenta.

Una solución más rápida es un dispositivo de la clase StringBuffer que a través de los algoritmos inteligentes que proporcionan un búfer (que es obvio por su nombre) para fusionar cadenas y como resultado no eliminaría la cadena inicial durante el proceso de concatenación.

En caso de que esté escribiendo una sola aplicación de subproceso (no hay problemas de concurrancia durante los cuales múltiples subprocesos accedan al mismo objeto), es mejor aplicar StringBuilder, que tiene un rendimiento aún más rápido que la clase StringBuffer inicial.