Подтвердить что ты не робот

Какое преимущество неизменности String?

Как только я узнал о преимуществах неизменяемой строки из-за чего-то, чтобы улучшить производительность в памяти.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

  • Он может дать ссылку на объект, который содержит данные, но с контентом которого он не заботится.

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

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

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