Ответ 1
Неизменяемые типы обычно хороши:
- Они работают лучше для concurrency (вам не нужно блокировать что-то, что не может измениться!)
- Они уменьшают ошибки: изменяемые объекты уязвимы для изменения, если вы не ожидаете, что это может привести к появлению всех видов странных ошибок ( "действие на расстоянии" )
- Их можно безопасно разделить (т.е. несколько ссылок на один и тот же объект), что может сократить потребление памяти и улучшить использование кеша.
- Совместное использование также делает копирование очень дешевой операции O (1), когда это будет O (n), если вам нужно взять защитную копию изменяемого объекта. Это очень важно, потому что копирование является невероятно распространенной операцией (например, когда вы хотите передавать параметры вокруг....)
В результате это довольно разумный выбор языка, чтобы сделать строки неизменяемыми.
Некоторые языки (особенно функциональные языки, такие как Haskell и Clojure) идут еще дальше и делают практически все неизменным. Это просветительское видео очень стоит посмотреть, если вы заинтересованы в преимуществах неизменности.
Есть несколько незначительных недостатков для неизменяемых типов:
- Операции, которые создают измененную строку, такую как конкатенация, дороже, потому что вам нужно создавать новые объекты. Обычно стоимость O (n + m) для конкатенации двух неизменяемых строк, хотя она может достигать O (log (m + n)), если вы используете структуру данных на основе дерева, такую как Rope. Кроме того, вы всегда можете использовать специальные инструменты, такие как Java StringBuilder, если вам действительно нужно эффективно конкатенировать строки.
- Небольшое изменение в большой строке может привести к необходимости создания полностью новой копии большой строки, что, очевидно, увеличивает потребление памяти. Обратите внимание, однако, что это обычно не является большой проблемой в сборках мусора, поскольку старая копия будет получать мусор, собранный довольно быстро, если вы не будете ссылаться на него.
В целом, однако, преимущества неизменности значительно перевешивают незначительные недостатки. Даже если вас интересует только производительность, преимущества concurrency и дешевизна копирования в целом сделают неизменяемые строки намного более эффективными, чем изменчивые с блокировкой и защитным копированием.