В чём разница между StringBuffer и StringBuilder?

Объясните различия этих двух классов

Строка, как известно, является по сути своей неизменяемым объектом в памяти. Любые изменения строки по сути генерируют новую строку, перепривязывают ссылки, а старые удаляются или сборщиками мусора, или вручную.

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

Эти классы практически одинаковые, конструкторы примерно одни и те же, методы одинаковы. Единственное отличие между ними состоит в том что StringBuffer потокобезопасный и синхронизированный. Это означает что в многопоточных приложениях удобнее всего использовать StringBuffer.

В случае если речь не идёт о многопоточных приложениях, то логичнее использовать StringBuilder, который не потокобезопасный, но работает в однопоточных приложениях быстрее.