metodo example concatenar caracteres java string-concatenation

java - example - Operador de concatenación(+) vs. concat()



metodo concat java (8)

Esta pregunta ya tiene una respuesta aquí:

Para la concatenación de cadenas podemos usar el operador concat() o el operador concat (+) .

He intentado la siguiente prueba de rendimiento y descubrí que concat() es una forma más rápida y eficiente de memoria para la concatenación de cadenas.

Comparación de concatenación de cuerdas por 100,000 veces :

String str = null; //------------Using Concatenation operator------------- long time1 = System.currentTimeMillis(); long freeMemory1 = Runtime.getRuntime().freeMemory(); for(int i=0; i<100000; i++){ str = "Hi"; str = str+" Bye"; } long time2 = System.currentTimeMillis(); long freeMemory2 = Runtime.getRuntime().freeMemory(); long timetaken1 = time2-time1; long memoryTaken1 = freeMemory1 - freeMemory2; System.out.println("Concat operator :" + "Time taken =" + timetaken1 + " Memory Consumed =" + memoryTaken1); //------------Using Concat method------------- long time3 = System.currentTimeMillis(); long freeMemory3 = Runtime.getRuntime().freeMemory(); for(int j=0; j<100000; j++){ str = "Hi"; str = str.concat(" Bye"); } long time4 = System.currentTimeMillis(); long freeMemory4 = Runtime.getRuntime().freeMemory(); long timetaken2 = time4-time3; long memoryTaken2 = freeMemory3 - freeMemory4; System.out.println("Concat method :" + "Time taken =" + timetaken2 + " Memory Consumed =" + memoryTaken2);

Resultado

Concat operator: Time taken = 31; Memory Consumed = 2259096 Concat method : Time taken = 16; Memory Consumed = 299592

Si concat() es más rápido que el operador, ¿cuándo deberíamos usar el operador de concatenación (+) ?


Aunque tanto el operador como el método dan el mismo resultado, la forma en que trabajan internamente difiere.

El método concat() que solo concatena str1 con str2 y genera una cadena, es más eficiente para un pequeño número de concatenaciones.

Pero con el operador de concatenación ''+'', str1+=str2 ; se interpretará como str1 = new StringBuilder().append(str1).append(str2).toString();

Puede usar el método concat cuando use un número menor de cadenas para concatenar. Pero el método StringBuilder sería rápido en términos de rendimiento, si está utilizando un gran número de cadenas.


Creo que el ''estilo'' de concatenación va a marcar la diferencia.

Para concat (), crea internamente un nuevo búfer de matriz de caracteres y devuelve una nueva cadena basada en esa matriz de caracteres.

Para el operador +, el compilador de hecho lo traduce para usar StringBuffer / StringBuilder.

Por lo tanto, si está concatenando dos cadenas, concat () es definitivamente una mejor opción porque el número de objetos creados es solo la Cadena resultante (y el búfer de caracteres utilizado en el interior), mientras que el operador + se traducirá a:

result = strA + strB; -- translate to --> result = new StringBuilder(strA).append(strB).toString();

Se crea una instancia extra de StringBuilder.

Sin embargo, si está concatenando, por ejemplo, cinco cadenas seguidas, cada concat () creará un nuevo objeto String. Mientras usa el operador + , el compilador traducirá la declaración a un StringBuilder con múltiples operaciones de adición. Definitivamente está guardando una gran cantidad de instancias de objetos temporales innecesarios:

result = strA + strB + strC + strD + strE; -- translate to --> result = new StringBuilder(strA).append(strB).append(strC).append(strD).append(strE).toString();


De hecho, s1 + s2 y s1.concat (s2) son muy diferentes.

s1 + s2 es convertido por javac en

(new StringBuilder(String.valueOf(s1)).append(s2).toString();

Puedes verlo si descompilas .class. Este constructo no es muy eficiente; implica hasta tres nuevas asignaciones de char [] y tres operaciones de copia de char [].

s1.concat (s2) siempre es un nuevo char [] + una operación de copia, vea String.java

public String concat(String str) { int otherLen = str.length(); if (otherLen == 0) { return this; } char buf[] = new char[count + otherLen]; getChars(0, count, buf, 0); str.getChars(0, otherLen, buf, count); return new String(0, count + otherLen, buf); }

Tenga en cuenta que el nuevo String (int, int, char []) es el constructor privado del paquete de String. Utiliza char buf [] directamente, sin la copia habitual para garantizar la invisibilidad de buf para la inmutabilidad de la cadena.


El método concat siempre produce una nueva cadena con el resultado de la concatenación.

El operador plus está respaldado por la creación de StringBuilder, agregando todos los valores de String que necesita y además toString () invocándolo.

Por lo tanto, si necesita concatenar dos valores, concat () será la mejor opción. Si necesita concatenar 100 valores, debe usar el operador más o usar StringBuilder explícitamente (por ejemplo, en caso de agregarse en un ciclo).


En general, es una mala práctica concatenar cadenas con + y con concat() . Si quieres crear una cadena usa StringBuilder lugar.


En realidad, ambos son iguales. Si ve el código de concat(String paramString) devolverá un nuevo objeto de cadena, y en el operador (+) también generará un nuevo objeto de cadena.

Si no desea crear un nuevo objeto, use el generador de cadenas para concatenar dos cadenas.


Siempre puede usar + si solo usa> = Java 1.5 y no declara su String base (que desea concatenar) fuera del bucle. En Java 1.5, se crea un new StringBuilder y se trabaja hasta que se completa la cadena. Esa es la forma más rápida.

De todos modos, si estás en un bucle (y concatenando cadenas con + ), cada iteración del bucle crea un new StringBuilder : esa no es la mejor idea. Entonces, aquí es donde debe forzar el uso de las clases StringBuilder o StringBuffer (seguro para subprocesos).

En general, este enlace responde claramente a su pregunta y le brinda un conocimiento completo:

http://littletutorials.com/2008/07/16/stringbuffer-vs-stringbuilder-performance-comparison/


Su prueba debe estar ejecutándose durante al menos 2 segundos con cada bucle en un método separado para que tenga sentido. Las pruebas cortas pueden ser difíciles de reproducir y comparar. Desde su sincronización parece que está usando Windows (es decir, porque sus tiempos son 16 y 31 ms;) Pruebe System.nanoTime () en su lugar. Cuando su bucle se repite más de 10.000 veces, se compila todo el método. Esto significa que su método posterior ya está compilado cuando se inicia.

En respuesta a su pregunta, concat es ligeramente más rápido cuando agrega dos cadenas. Sin embargo, viene con una sobrecarga de mecanografía y conceptual que probablemente sea mucho mayor que la CPU que guarda. Incluso en base a que sus pruebas se repiten 100.000 veces, se ahorra menos de 15 ms y, sin embargo, le costará mucho, mucho más que eso en su tiempo (lo que probablemente valga más) Puede encontrar en una futura versión de la JVM, la la diferencia se optimiza siempre y la complejidad de su código sigue ahí.

EDIT: No me di cuenta de que el resultado de la memoria era sospechoso.

String str = null; //------------Using Concatenation operator------------- long time1 = System.currentTimeMillis(); long freeMemory1 = Runtime.getRuntime().freeMemory(); for (int i = 0; i < 10000; i++) { str = "Hi"; str = str + " Bye"; } long time2 = System.currentTimeMillis(); long freeMemory2 = Runtime.getRuntime().freeMemory(); long timetaken1 = time2 - time1; long memoryTaken1 = freeMemory1 - freeMemory2; System.out.println("Concat operator :" + "Time taken =" + timetaken1 + " Memory Consumed= " + memoryTaken1); str = null; //------------Using Concat method------------- long time3 = System.currentTimeMillis(); long freeMemory3 = Runtime.getRuntime().freeMemory(); for (int j = 0; j < 10000; j++) { str = "Hi"; str = str.concat(" Bye"); } long time4 = System.currentTimeMillis(); long freeMemory4 = Runtime.getRuntime().freeMemory(); long timetaken2 = time4 - time3; long memoryTaken2 = freeMemory3 - freeMemory4; System.out.println("Concat method :" + "Time taken =" + timetaken2 + " Memory Consumed= " + memoryTaken2);

imprime cuando se ejecuta con -XX:-UseTLAB -mx1g

Concat operator :Time taken =12 Memory Consumed= 1291456 Concat method :Time taken =7 Memory Consumed= 560000

haciendo la relación de uso de memoria de 2: 1. En la pregunta original, el resultado varía cada vez que lo ejecutas, a veces parece que .concat() usa más.