String.join () frente a otras operaciones de concatenación de cadenas

He leído rápidamente la documentación de Java8 String api .

Ahora tengo un poco de curiosidad sobre el método String.join () para concat / join strings.

Este tipo de ejemplo me ha ayudado a entender mejor, sin embargo:

//Old way: String str1 = "John"; String str2 = "Doe"; String result = str1 + " " +str2; //or by using str1.concat(str2); //New way: String result = String.join(" ", str1, str2); 

Aún así, no entiendo cuál debo usar. ¿Hay algún rendimiento u otras diferencias entre estos dos procesos?

Cualquier ayuda sería muy apreciada.

String.join basa en la clase StringJoiner que a su vez se basa en un StringBuilder interno para construir la cadena unida.

Por lo tanto, en lo que respecta al rendimiento, es lo mismo que usar un StringBuilder y agregarlo, o usar una cadena de + (que en la actualidad se convierten en operaciones de StringBuilder por parte del comstackdor).

Pero el significado de String.join no es como un reemplazo general para + o String.concat , sino como la “operación inversa” de una operación String.split . Tiene más sentido en ese contexto, cuando tienes un montón de cadenas que deseas unir usando un delimitador, que como un reemplazo para concat .

Es decir, para generar una salida como "a/b/c/d" o "(a+b+c+d)" cuando tiene a , b , c y d en una matriz o una lista, String.join o un StringJoiner haría la operación clara y legible.

str1 + " " + str2 se convierte internamente en:

 StringBuffer tmp1 = new StringBuffer(); tmp1.append(str1); tmp1.append(" "); String tmp2 = tmp1.toString(); StringBuffer tmp3 = new StringBuffer(); tmp3.append(tmp2); tmp3.append(str2); String result = tmp3.toString(); 

str1.concat(str2) no producirá el mismo resultado, ya que el espacio no estará presente entre las dos cadenas.

unirse debería ser equivalente a

 StringBuffer tmp1 = new StringBuffer(); tmp1.append(str1); tmp1.append(" "); tmp1.append(str2); String result = tmp.toString(); 

y por lo tanto ser más rápido.