В чем преимущество неизменности String?

Однажды я узнал о том, что струна неизменна из-за чего-то, что улучшает производительность в памяти.

Кто-нибудь может мне это объяснить? Я не могу найти это в интернете.

7 ответов

Неизменность (для строк или других типов) может иметь множество преимуществ:

  • Это облегчает рассуждение о коде, поскольку вы можете делать предположения о переменных и аргументах, которые вы не можете сделать иначе.
  • Это упрощает многопоточное программирование, поскольку чтение из типа, который не может измениться, всегда безопасно выполнять одновременно.
  • Это позволяет уменьшить использование памяти, позволяя объединять идентичные значения и ссылаться на них из разных мест. И Java, и C# выполняют интернирование строк, чтобы уменьшить стоимость памяти литеральных строк, встроенных в код.
  • Это упрощает разработку и реализацию определенных алгоритмов (например, использующих возвратный контроль или разбиение пространства значений), поскольку ранее вычисленное состояние может быть повторно использовано позже.
  • Неизменность является основополагающим принципом во многих функциональных языках программирования - он позволяет рассматривать код как серию преобразований из одного представления в другое, а не как последовательность мутаций.

Неизменяемые строки также помогают избежать соблазна использовать строки в качестве буферов. Многие дефекты в программах на C/C++ связаны с проблемами переполнения буфера, возникающими из-за использования открытых символьных массивов для составления или изменения строковых значений. Обработка строк как изменяемых типов поощряет использование типов, более подходящих для работы с буфером (см. StringBuilder в.NET или Java).

Рассмотрим альтернативу. У Java нет квалификатора const. Если бы объекты String были изменяемыми, то любой метод, на который вы передаете ссылку на строку, мог бы иметь побочный эффект изменения строки. Неизменяемые строки устраняют необходимость в защитных копиях и снижают риск ошибки программы.

Неизменяемые строки дешевы для копирования, потому что вам не нужно копировать все данные - просто скопируйте ссылку или указатель на данные.

Любые неизменные классы легче работать в нескольких потоках, единственная синхронизация, необходимая для уничтожения.

Возможно, мой ответ устарел, но, возможно, кто-то найдет здесь новую информацию.

Почему Java String неизменна и почему это хорошо:

  • вы можете разделить строку между потоками и быть уверенным, что никто из них не изменит строку и не запутает другой поток
  • тебе не нужен замок. Несколько потоков могут работать с неизменяемой строкой без конфликтов
  • если вы только что получили строку, вы можете быть уверены, что никто не изменит ее значение после этого
  • Вы можете иметь много строк-дубликатов - они будут указывать на один экземпляр, только на одну копию. Это экономит память компьютера (RAM)
  • Вы можете сделать подстроку без копирования, - создав указатель на элемент существующей строки. Вот почему реализация операции с подстрокой Java так быстро
  • неизменяемые строки (объекты) гораздо лучше подходят для использования их в качестве ключа в хеш-таблицах

a) Представьте себе объект StringPool, не делая строку неизменной, это вообще невозможно, потому что в случае пула строк один строковый объект / литерал, например, "Test", на который ссылаются многие ссылочные переменные, поэтому, если любая из них изменит значение, другие будут автоматически то есть, скажем, String A = "Test" и String B = "Test" Теперь строка B называется "Test".toUpperCase(), которые заменяют тот же объект на "TEST", поэтому A также будет "TEST", который не является желательно.
б) Еще одна причина того, почему String является неизменяемой в Java, заключается в том, что String может кэшировать свой хеш-код, поскольку String в Java кэширует свой хеш-код и не вычисляет каждый раз, когда мы вызываем метод String для хеш-кода, что делает его очень быстрым в качестве ключа hashmap.,

По сути, если один объект или метод хочет передать информацию другому, есть несколько способов сделать это:

  1. Он может дать ссылку на изменяемый объект, который содержит информацию и которую получатель обещает никогда не изменять.

  2. Он может давать ссылку на объект, который содержит данные, но чье содержимое ему безразлично.

  3. Он может хранить информацию в изменчивом объекте, о котором знает предполагаемый получатель данных (обычно тот, который предоставляется этим получателем данных).

  4. Может возвращать ссылку на неизменный объект, содержащий информацию.

Из этих методов № 4, безусловно, самый простой. Во многих случаях с изменяемыми объектами легче работать, чем с неизменяемыми, но не существует простого способа поделиться с "ненадежным" кодом информацией, которая находится в изменяемом объекте, без необходимости сначала копировать информацию в что-то другое. Напротив, информация, содержащаяся в неизменяемом объекте, на который хранится ссылка, может быть легко передана простым обменом копией этой ссылки.

Подумайте о различных струнах, сидящих в общем бассейне. Строковые переменные затем указывают на места в пуле. Если вы копируете строковую переменную, то и оригинал, и копия имеют одинаковые символы. Эта эффективность совместного использования перевешивает неэффективность редактирования строк путем извлечения подстрок и объединения.

Другие вопросы по тегам