2012-01-04 16 views
16

¿Esto es malo?Eficiencia de concatenación de cadenas de Java

(imaginemos que es más grande)

int count; 
//done something to count 
String myString = "this " + "is " + "my " + "string" + "and " + this.methodCall() + " answer " + "is : " + count; 

o es mejor en un StringBuilder/StringBuffer?

Respuesta

25

compilador Java convertirá en StringBuilder para aumentar el rendimiento de la concatenación de cadenas repetidas. http://java.sun.com/docs/books/jls/third%5Fedition/html/expressions.html#15.18.1.2

Cuando se está concatenando en un compilador de bucle no puede sustituir a StringBuilder por sí solo, entonces es cuando se debe considerar la concatenación a StringBuilder.

+0

¿Qué pasa con este [artículo] (http://www.pellegrino.link/2015/08/22/string-concatenation-with-java-8.html)? – gaheinrichs

+0

"Su concatenando cuando se está en un bucle compilador no puede sustituir StringBuilder por sí mismo que es cuando se debe tener en cuenta a partir de la concatenación StringBuilder" – user765635

+0

_Its cuando se está concatenando en un bucle ** ** que el compilador no puede sustituir por StringBuilder sí mismo. Es entonces cuando deberías considerar ** cambiar ** de concatenación a ** usando ** StringBuilder_ – Trunk

3

sería más legible si utiliza StringBuilder/StringBuffer (elegir sobre la base del modelo de rosca aplicación)

si se escribe

String str = "abc"; 
    str+="def"; 

Internamente se creará StringBuilder para el mismo

7: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V 
    10: aload_1 
    11: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    14: ldC#6; //String def 
    16: invokevirtual #5; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
    19: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
    22: astore_1 
1

(imagine que es grande er) ...

La concatenación de cadenas con el operador "+" crea muchos objetos temporales y aumenta la recolección de basura. Usar la clase StringBuffer es más eficiente.

Más aquí: http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html

StringBuffer strBuf = new StringBuffer(); 
strBuf.append("this"); 
strBuf.append("is"); 
strBuf.append("my"); 
strBuf.append("string"); 
strBuf.append("and"); 
strBuf.append(this.methodCall()); 
strBuf.append(" answer "); 
strBuf.append("is : "); 
strBuf.append(count); 

pueden estar relacionados: String concatenation: concat() vs "+" operator

+0

sí, pero es que el caso sólo cuando se está concatinating en un bucle en lugar de construir la cadena de una sola vez? –

+0

¿Cuál es la diferencia? Use StringBuffer si hace muchas concatenaciones – JohnJohnGa

+3

Citar [su fuente] (http://www.ibm.com/developerworks/websphere/library/bestpractices/string_concatenation.html) siempre es útil. –

1

Usted debe preferir StringBuilder sobre la concatenación de cadenas, ya que tiene una llamada método y variable que se añaden a cadenas.

Sin embargo, la cantidad de cadenas simples como "this" y "is" no tiene ningún efecto en el rendimiento, ya que el compilador las procesará efectivamente y crear cadenas internas que terminarán en bytecode. Habiendo dicho esto, las cadenas mencionadas no tendrán gastos generales en el rendimiento final.

2

Relatively new article with graph, mostrando que la concatenación con '+' escala bastante horriblemente. Y como se menciona en otra respuesta, StringBuilder probablemente será más legible.

1

No creo que marque la diferencia en el rendimiento cuando una secuencia se escribe así: el compilador la optimizará de todos modos.

4

No, está bien. Si usa el compilador Java 6 de Sun, realmente usará StringBuilder.

Lea este article

4

El Javadoc para los estados de StringBuffer de Java 5.0

La clase StringBuilder generalmente se debe utilizar con preferencia a esta, ya que admite todas las mismas operaciones pero es más rápida, ya que no realiza ninguna sincronización.

El compilador combinará los literales de cadena por lo que su lo mismo que escribir

String myString = "this is my stringand " + this.methodCall() + " answer is : " + count; 

que es el mismo que

String myString = new StringBuilder().append("this is my stringand ").append(methodCall()).append(" answer is : ").append(count).toString(); 

yo no preocuparse por el rendimiento a menos que necesite elimine la basura de su sistema, en cuyo caso no usaría cadenas aquí. (Su muy poco probable que usted necesita preocuparse al respecto)

Cuestiones relacionadas