Cuando tu concatenas algo con un String lo que estas haciendo es generar un objeto nuevo con la cadena resultante. Ejemplo
String cadena1 = "hola";
String cadena2 = "hola";
En este ejemplo ambas String(cadena1 y cadena2) contienen la misma cadena "hola". Si tu haces lo siguiente:
cadena1 =cadena1 + " mundo";
Lo que se hace aqui es hacer una cadena "hola mundo" y asignarla a cadena1.
Un StringBuffer es distinto. Funciona como si tubieras un arreglo de datos tipo char. Y las modificaciones que le haces son realizadas sobre los datos que contiene.