Your statement would have been true if the StringBuffer simply contains a string property and appends the value as string.
But that is not the case, basically there are two basic types/categories of objects based on their memory allocation behavior - Mutable and Immutable.
String is Immutable, which means every time you make a modification / concatenate text with existing text. The object is created newly by assigning new memory address and that is a very costly process.
Whereas StringBuffer on the other hand is Mutable, because of that the object is not created every time append is called.
Hope this helps.