String и StringBuilder

Чем класс String отличается от класса StringBuilder? Частенько вижу этот вопрос в списке обязательного что нужно знать, но ответа определённого я так и не нашёл

При добавлении символов StringBuilder определяет, не выходит ли новый размер массива за установленный предел. Если да, то StringBuilder автоматически удваивает емкость, и исходя из этого значения, выделяет память под новый массив, а затем копирует символы из исходного массива в новый. Исходный массив в дальнейшем утилизируется сборщиком мусора. - По Джеффри Рихтеру.

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

Также StringBuilder это своего рода обёртка над строками.

Строка не изменяема, а StringBuilder можно изменить.

Если менять String, то в результате получим новую строку, а старая будет выброшена