java - que - string buffer
Cuándo usar StringBuilder en Java (9)
Esta pregunta ya tiene una respuesta aquí:
En general, se supone que es preferible utilizar un StringBuilder
para la concatenación de cadenas en Java. Este es siempre el caso?
Lo que quiero decir es esto: es la sobrecarga de crear un objeto StringBuilder
, llamar al método append()
y finalmente toString()
ya más pequeño que concatenar cadenas existentes con el operador +
para dos cadenas, o solo es recomendable para más (que dos ) cuerdas?
Si existe tal umbral, ¿de qué depende (quizás la longitud de la cadena, pero de qué manera)?
Y, finalmente, ¿cambiaría la legibilidad y la concisión de la concatenación +
para el rendimiento del StringBuilder
en casos más pequeños como dos, tres o cuatro cadenas?
El uso explícito de StringBuilder
para concatenaciones regulares se menciona como obsoleto en las obsoletas sugerencias de optimización de Java , así como en los mitos urbanos de Java .
Algunos compiladores no pueden reemplazar ninguna concatenación de cadenas con equivalentes de StringBuilder. Asegúrese de considerar qué compiladores utilizará su fuente antes de confiar en las optimizaciones de compilación.
Como regla general, siempre use el código más legible y solo refactorice si el rendimiento es un problema. En este caso específico, los JDK más recientes realmente optimizarán el código en la versión de StringBuilder en cualquier caso.
Por lo general, solo necesitas hacerlo manualmente si estás haciendo concatenación de cadenas en un bucle o en algún código complejo que el compilador no puede optimizar fácilmente.
Eche un vistazo a: http://www.javaspecialists.eu/archive/Issue068.html y http://www.javaspecialists.eu/archive/Issue105.html
Realice las mismas pruebas en su entorno y verifique si el JDK más reciente o su implementación Java realizan algún tipo de operación de cadena mejor con String
o mejor con StringBuilder
.
El material de certificación de Microsoft aborda esta misma pregunta. En el mundo .NET, la sobrecarga para el objeto StringBuilder hace que una concatenación simple de 2 objetos String sea más eficiente. Asumiría una respuesta similar para las cadenas de Java.
El operador + usa public String concat(String str)
internamente. Este método copia los caracteres de las dos cadenas, por lo que tiene requisitos de memoria y complejidad de tiempo de ejecución proporcional a la longitud de las dos cadenas. StringBuilder funciona de manera más eficiente.
Sin embargo, he leído here que el código de concatinación que utiliza el operador + se cambia a StringBuilder en los compiladores posteriores a Java 4. Así que esto podría no ser un problema en absoluto. (¡Aunque realmente verificaría esta declaración si dependiera de ella en mi código!)
El problema con la concatenación de cadenas es que conduce a la copia del objeto String con todo el costo asociado. StringBuilder no es seguro para subprocesos y, por lo tanto, es más rápido que StringBuffer, que solía ser la opción preferida antes de Java 5. Como regla general, no debe hacer concatenación de cadenas en un bucle, que se llamará a menudo. Supongo que hacer algunas concatenaciones aquí y allá no te hará daño siempre que no estés hablando de cientos y esto, por supuesto, depende de tus requisitos de rendimiento. Si estás haciendo cosas en tiempo real, debes tener mucho cuidado.
La respuesta de Ralph es fabulosa. Preferiría usar la clase StringBuilder para construir / decorar el String porque su uso es más parecido al patrón Builder.
public String decorateTheString(String orgStr){
StringBuilder builder = new StringBuilder();
builder.append(orgStr);
builder.deleteCharAt(orgStr.length()-1);
builder.insert(0,builder.hashCode());
return builder.toString();
}
Puede usarse como un ayudante / constructor para construir la Cadena, no la Cadena en sí.
Para dos cadenas, concat es más rápido, en otros casos, StringBuilder es una mejor opción, vea mi explicación en operador de concatenación (+) vs concat ()
Si utiliza la concatenación de cadenas en un bucle, algo como esto,
String s = "";
for (int i = 0; i < 100; i++) {
s += ", " + i;
}
entonces deberías usar un StringBuilder
(no StringBuffer
) en lugar de un String
, porque es mucho más rápido y consume menos memoria.
Si tiene una sola declaración,
String s = "1, " + "2, " + "3, " + "4, " ...;
luego puede usar String
s, porque el compilador usará StringBuilder
automáticamente.