Почему существуют эти 3 класса?
Во-первых, класс String является неизменным: если вы вызываете метод объекта String, который что-то в нем изменяет, вы получите новую строку в результате.
Но в некоторых случаях это не то, что Вы могли бы хотеть, может быть, потому что Вы обрабатываете много строк и не хотите создавать новый объект каждый раз, когда Вы что-то меняете.По этой причине был добавлен StringBuffer.
StringBuffer был также разработан для поточной защиты.Это означает, что вы получаете немного дополнительных затрат на большинство методов.Поэтому, если вашей программе требуется много операций с String (например, jgrep), это может стать узким местом.
Наконец, был добавлен StringBuilder.Это в основном StringBuffer без синхронизации.
А как насчет этого странного именования?По иронии судьбы, чтобы избежать путаницы ... Поскольку concat уже находится в String, но возвращает новый объект, лучше всего добавить другой метод.