StringBuffer has a performance advantage when you concatenate a lot of variable parts into one string. You can try some experiments on your target platform to see when "a lot" becomes worth the effort of using a StringBuffer.
StringBuffer is also mutable, meaning you can change it, while String is not.
Look through the
doc and compare methods. What can one do that the other cannot?