String catenation is implemented using StringBuffer. So, for example,
String s3 = s1 + s2;
will be compiled into something like
StringBuffer _tmp = new StringBuffer(s1); _tmp.append(s2); String s3 = _tmp.toString();
So really, they're the same. But if you're adding multiple Strings together, and you're doing it in a loop where performance matters, then you can generally write more efficient StringBuffer code by hand than the compiler will generate.