In the book \"Effective Java\", Josh Bloch says that
StringBuffer is largely obsolete and should be replaced by the non-synchronized implementation \'S
I think obsolete is an overstatement.
StringBuffer is synchronized. StringBuilder is not.
In many (maybe most) cases, you won't care about the thread safety of something used to build strings. You should use StringBuilder in these cases. In some cases, however, you may very well want to make sure actions on the object is thread safe. StringBuffer is still useful in those cases.