2010-01-13 9 views
6

Siempre que trato de sumar los números en la cadena como:tema de la velocidad, mientras que concatenar cadenas

String s=new String(); 

for(int j=0;j<=1000000;j++) 

    s+=String.valueOf(j); 

Mi programa es la adición de los números, pero muy lentamente. Pero cuando alteré mi programa y lo hice como:

StringBuffer sb=new StringBuffer(); 

for(int j=0;j<=1000000;j++) 

sb.append(String.valueOf(j)); 

Obtuve el resultado muy rápidamente. ¿Por qué es así?

+0

http://www.joelonsoftware.com/ artículos/fog0000000319.html – moonshadow

+0

Le sugiero que lea Java efectivo http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683 Este libro cubrirá el conocimiento básico de la programación de Java. Si usted tiene más preguntas, todavía se puede volver aquí, por supuesto – nanda

+0

Se va a llegar más rápido aún si previamente el tamaño del StringBuffer: 'StringBuffer sb = new StringBuffer (5.888.896);' Entonces podría obtener * ligeramente * más rápido de nuevo si cambia a 'StringBuilder'. Por cierto, solo puede usar 'sb.append (j);' para anexar el número. –

Respuesta

6

s+=String.valueOf(j); necesita asignar un nuevo objeto String cada vez que se lo llama, y ​​esto es costoso. El StringBuffer solo necesita aumentar alguna representación interna cuando la cadena contenida es demasiado grande, lo que ocurre con mucha menos frecuencia.

Probablemente sería aún más rápido si usó un StringBuilder, que es una versión no sincronizada de un StringBuffer.

Una cosa a tener en cuenta es que, si bien esto no se aplica a los bucles y muchos otros casos, no se aplica necesariamente a todos los casos en cadenas se concatenan mediante +:

String helloWorld = getGreeting() + ", " + getUsername() + "!"; 

En este caso, el compilador probablemente optimizar el código de una manera que considere adecuada, que puede o no crear un StringBuilder, ya que también es una operación costosa.

+0

+1 para StringBuilder. También podría preasignar memoria para ello (parámetro para el constructor). – Thilo

1

Porque s + = "cadena" crea una nueva instancia. Una cadena es inmutable. StringBuffer o StringBuilder agrega la cadena sin crear una nueva instancia.

1

En Java como en .NET Las cadenas son inmutables. No pueden ser cambiados después de la creación. El resultado es que al usar el operador + se creará una nueva cadena y se copiarán los contenidos de ambas cadenas en ella.

Un StringBuffer duplicará el espacio asignado cada vez que se quede sin espacio para agregar caracteres. De esta forma, se reduce la cantidad de asignaciones de memoria.

Cuestiones relacionadas