metodo - ¿Hay alguna diferencia entre String concat y el operador+en Java?
metodo concat java (4)
Duplicar
Tengo curiosidad por cuál es la diferencia entre los dos.
La forma en que entiendo el conjunto de cadenas es la siguiente:
Esto crea 3 objetos de cadena en el conjunto de cadenas, de los cuales se pierden todas las referencias.
String mystr = "str";
mystr += "end";
¿No crea esto también 3 objetos en el conjunto de cadenas?
String mystr = "str";
mystr = mystr.concat("end")
Sé que StringBuilder y StringBuffer son mucho más eficientes en términos de uso de memoria cuando hay mucha concatinación por hacer. Solo tengo curiosidad por saber si hay alguna diferencia entre el operador + y el concat en términos de uso de memoria.
La forma en que entiendo el conjunto de cadenas es la siguiente:
Parece que tienes un concepto erróneo sobre ese término. No existe tal cosa como un "conjunto de cadenas": la forma en que lo está utilizando parece que se refiere a todo el objeto String en el montón. Hay un grupo de constantes de tiempo de ejecución que contiene, entre muchas otras cosas, constantes de cadena en tiempo de compilación e instancias de cadena devueltas desde String.intern()
A menos que el argumento a concat sea una cadena vacía, entonces
String mystr = "str";
mystr = mystr.concat("end")
También creará 3 cuerdas.
Más información: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html
La diferencia importante entre +=
y concat()
no es el rendimiento, es la semántica. concat()
solo aceptará un argumento de cadena, pero +
(o +=
) aceptará cualquier cosa . Si el operando no de cadena es un objeto, se convertirá en una cadena llamando a toString()
en él; una primitiva se convertirá como si se llamara al método apropiado en la clase de envoltura asociada, por ejemplo, Integer.toString(theInt)
; y una referencia nula se convierte en la cadena "null"
.
En realidad, no sé por qué concat()
incluso existe. La gente lo ve en la documentación de la API y asume que está ahí por una buena razón: el rendimiento es la razón más obvia. Pero eso es una pista falsa; Si el rendimiento es realmente una preocupación, debería usar un StringBuilder, como se explica en el hilo al que John lo vinculó. De lo contrario, +
o +=
es mucho más conveniente.
EDITAR: En cuanto a la cuestión de "crear objetos en el conjunto de cadenas", creo que está malinterpretando qué es el conjunto de cadenas. En el tiempo de ejecución, las secuencias de caracteres reales, "str" y "end" se almacenarán en una estructura de datos dedicada, y siempre que vea los literales "str"
y "end"
en el código fuente, el código de bytes realmente contendrá referencias a las entradas apropiadas en esa estructura de datos.
De hecho, el conjunto de cadenas se llena cuando se cargan las clases, no cuando se ejecuta el código que contiene los literales de cadena. Eso significa que cada uno de sus fragmentos solo crea un objeto: el resultado de la concatenación. (También hay algo de creación de objetos detrás de escena, que es un poco diferente para cada una de las técnicas, pero no vale la pena preocuparse por el impacto en el rendimiento).
No hay diferencia en este caso particular; Sin embargo, no son lo mismo en general.
str1 += str2
es equivalente a hacer lo siguiente:
str1 = new StringBuilder().append(str1).append(str2).toString();
Para probárselo a usted mismo, solo haga un método simple que tome dos cadenas y +=
''s la primera cadena a la segunda, luego examine el bytecode desensamblado.
Por el contrario, str1.concat(str2)
simplemente str1.concat(str2)
una nueva cadena que es la concatenación de str1
y str2
, que es menos costosa para un pequeño número de cadenas concatenadas (pero perderá la primera aproximación con un número mayor).
Además, si str1
es nulo, observe que str1.concat(str2)
lanza un NPE, pero str1 += str2
simplemente tratará a str1
como si fuera nulo sin lanzar una excepción. (Es decir, produce "nulo" concatenado con el valor de str2
. Si str2
fuera, por ejemplo, "foo", terminaría con "nullfoo").
Actualización: vea esta pregunta de , que es casi idéntica.