2011-12-18 26 views
14

Estaba leyendo esta página de documentación, http://developer.android.com/reference/android/util/Log.html.Android StringBuilder vs Concatenación de cadenas

La sección aquí me llamó la atención:

Consejo: No hay que olvidar que cuando se hace una llamada como

Log.v(TAG, "index=" + i);

que cuando está la construcción de la cadena para pasar a Log.d, el compilador utiliza un StringBuilder y se producen al menos tres asignaciones: el StringBuilder, el búfer y el objeto String. Realísticamente, también hay otra asignación y copia de búfer, y aún más presión en el gc. Eso significa que si su mensaje de registro es filtrado, es posible que esté haciendo un trabajo importante y que tenga una sobrecarga significativa .

Esto implica que el compilador de Android está tomando concatenaciones de cadenas (+) y las convierte en StringBuilder y agrega sentencias.

¿Es correcta mi suposición o es mejor usar StringBuilder manualmente en lugar de concatenación de cadenas?

+0

posible duplicado de [concatenación de cadenas en Java - cuándo utilizar +, StringBuilder y concat] (http://stackoverflow.com/ preguntas/7817951/string-concatenation-in-java-when-to-use-stringbuilder-and-concat) – givanse

Respuesta

9

El compilador hace exactamente lo que sugiere que está implícito. Puede imprimir los códigos de bytes del archivo .class generado (usando javap -c) y ver las llamadas para construir y usar un StringBuilder.

Sin embargo, generalmente vale la pena hacerlo manualmente cuando las concatenaciones de cadenas se extienden por varias líneas de código. El compilador normalmente asigna un StringBuilder por separado para cada expresión de valor de cadena que implique +.

+0

Lo he estado haciendo mal todo este tiempo. >< –

+1

@JeremyEdwards - Heh. He dicho eso sobre muchas cosas. :) –

+2

** "en general, vale la pena hacerlo manualmente cuando las concatenaciones de cadenas se extienden por varias líneas de código" ** - Solo quería enfatizar lo que dijo @TedHopp para que no se pierda. Concatené una cadena de 250 caracteres en unas 10 líneas y el tiempo de CPU en App Engine fue de 350 mseg. Cuando reemplacé esto con un solo StringBuilder, el tiempo había bajado a 50 mseg, otras cosas sin cambios. –

1

La respuesta de Ted Hopp es buena, pero fue necesario leerla unas cuantas veces para entenderla. Aquí hay una respuesta reformulada que es más clara.

La concatenación de cadenas (es decir, usando +, como en String myString = "Hello " + "World";) utiliza un StringBuilder en el fondo junto con otras asignaciones. Por lo tanto, para cualquier cosa que no sea una simple concatenación de una sola vez, sería mejor usar un StringBuilder usted mismo.

Por ejemplo,

StringBuilder myString = new StringBuilder(); 
myString.append("Hello "); 
myString.append("to "); 
myString.append("everyone "); 
myString.append("in "); 
myString.append("the "); 
myString.append("world!"); 

es mejor que

String myString = "Hello " + "to " + "everyone " + "in " + "the " + "world!"; 
+0

Pero si mi cadena es solo '' index = "+ i ', ¿cuál es la mejor manera?(Para el rendimiento) – GMX

+0

@GMX, esa es una buena pregunta y creo que dependerá del contexto. Si esto solo se llama con poca frecuencia, entonces usar '" index = "+ i' es mucho más legible que usar' StringBuilder'. Sin embargo, si se llama 1000 veces dentro de un bucle y el rendimiento es un problema, entonces tal vez algún tipo de opción 'StringBuilder' sería mejor. El punto principal de la respuesta aceptada, sin embargo, fue que cuando se necesitan varias líneas de código para construir una cadena, entonces definitivamente se usa un 'StringBuilder'. – Suragch

Cuestiones relacionadas