Объясните различия этих двух классов
Строка, как известно, является по сути своей неизменяемым объектом в памяти. Любые изменения строки по сути генерируют новую строку, перепривязывают ссылки, а старые удаляются или сборщиками мусора, или вручную.
Так или иначе, это сказывается на производительности в не наилучшую сторону. Что бы эту проблему решить (или по крайней мере уменьшить расходы по времени) в Java были введены классы StringBuffer и StringBuilder. По сути они представляют собой строку, которую можно модифицировать без ущерба для производительности.
Эти классы практически одинаковые, конструкторы примерно одни и те же, методы одинаковы. Единственное отличие между ними состоит в том что StringBuffer потокобезопасный и синхронизированный. Это означает что в многопоточных приложениях удобнее всего использовать StringBuffer.
В случае если речь не идёт о многопоточных приложениях, то логичнее использовать StringBuilder, который не потокобезопасный, но работает в однопоточных приложениях быстрее.