Suponiendo la cadena a y b:
a += b
a = a.concat(b)
Bajo el capó, ¿son lo mismo?
Aquí está concat descompilado como referencia. Me gustaría ser capaz de descompilar el operador +
también para ver lo que hace.
public String concat(String s) {
int i = s.length();
if (i == 0) {
return this;
}
else {
char ac[] = new char[count + i];
getChars(0, count, ac, 0);
s.getChars(0, i, ac, count);
return new String(0, count + i, ac);
}
}
Niyaz es correcto, pero también vale la pena señalar que el operador especial + puede ser convertido en algo más eficiente por el compilador de Java. Java tiene una clase StringBuilder que representa una cadena mutable no segura para los hilos. Al realizar un montón de concatenaciones de cadenas, el compilador de Java convierte silenciosamente
String a = b + c + d;
en
String a = new StringBuilder(b).append(c).append(d).toString();
que para cadenas grandes es significativamente más eficiente. Que yo sepa, esto no ocurre cuando se utiliza el método concat.
Sin embargo, el método concat es más eficiente cuando se concatena una cadena vacía en una cadena existente. En este caso, la JVM no necesita crear un nuevo objeto String y puede simplemente devolver el existente. Ver <a href="http://java.sun.com/javase/6/docs/api/java/lang/String.html#concat(java.lang.String)"la documentación de concat para confirmar esto.
Así pues, si le preocupa mucho la eficiencia, debería utilizar el método concat cuando concatene cadenas posiblemente vacías, y utilizar + en caso contrario. Sin embargo, la diferencia de rendimiento debería ser insignificante y probablemente no debería preocuparse por esto.
El operador + puede funcionar entre una cadena y un valor de tipo string, char, integer, double o float. Simplemente convierte el valor en su representación de cadena antes de la concatenación.
El operador concat sólo puede realizarse sobre y con cadenas. Comprueba la compatibilidad de los tipos de datos y lanza un error si no coinciden.
Excepto esto, el código que has proporcionado hace lo mismo.
No lo creo.
a.concat(b)
está implementado en String y creo que la implementación no ha cambiado mucho desde las primeras máquinas java. La implementación de la operación +
depende de la versión de Java y del compilador. Actualmente +
se implementa usando StringBuffer
para que la operación sea lo más rápida posible. Quizás en el futuro esto cambie. En versiones anteriores de java la operación +
sobre cadenas era mucho más lenta ya que producía resultados intermedios.
Supongo que +=
se implementa usando +
y se optimiza de forma similar.