Как только я узнал о преимуществах неизменяемой строки из-за чего-то, чтобы улучшить производительность в памяти.
Может кто-нибудь объяснить это мне? Я не могу найти его в Интернете.
Как только я узнал о преимуществах неизменяемой строки из-за чего-то, чтобы улучшить производительность в памяти.
Может кто-нибудь объяснить это мне? Я не могу найти его в Интернете.
Неизменяемость (для строк или других типов) может иметь множество преимуществ:
Неизменяемые строки также помогают избежать искушения использовать строки в качестве буферов. Многие недостатки в программах на C/С++ связаны с проблемами переполнения буфера, возникающими в результате использования массивов голых символов для составления или изменения строковых значений. Обработка строк в качестве изменяемых типов поощряет использование типов, более подходящих для манипуляции с буфером (см. StringBuilder
в .NET или Java).
Рассмотрим альтернативу. Java не имеет определителя констант. Если объекты String были изменены, то любой метод, которому вы передаете ссылку на строку, может иметь побочный эффект изменения строки. Неизменяемые строки устраняют необходимость в защитных копиях и уменьшают риск программной ошибки.
Неизменяемые строки дешевы для копирования, потому что вам не нужно копировать все данные - просто скопируйте ссылку или указатель на данные.
Неизменяемые классы любого типа легче работать с несколькими потоками, единственная необходимая синхронизация - для уничтожения.
Подумайте о различных строках, сидящих на общем пуле. Затем переменные String указывают на местоположения в пуле. Если и скопировать строковую переменную, то те же символы имеют оригинал и копия. Эта эффективность обмена перевешивает неэффективность редактирования строк путем извлечения подстрок и конкатенации.
a) Представьте себе объект StringPool, не делая строку неизменной, ее невозможно вообще, поскольку в случае пула строк один строковый объект/литерал, например. "Тест" ссылается на многие ссылочные переменные, поэтому, если какой-либо из них изменит значение, то другие будут автоматически затронуты, то есть скажем
Строка A = "Тест" и строка B = "Тест"
Теперь String B называется "Test".toUpperCase(), которые меняют один и тот же объект на "TEST", поэтому A также будет "TEST", что нежелательно.
b) Еще одна причина того, почему String неизменна в Java, - это позволить String кэшировать свой хэш-код, будучи неизменяемым. String в Java кэширует свой хэш-код и не вычисляет каждый раз, когда мы вызываем метод hashcode String, что делает его очень быстрым, как hashmap key.
Возможно, мой ответ устарел, но, вероятно, кто-то найдет здесь новую информацию.
Почему строка Java неизменна и почему она хороша:
В принципе, если один объект или метод хочет передать информацию другому, есть несколько способов сделать это:
Он может ссылаться на изменяемый объект, который содержит информацию, и который получатель promises никогда не будет изменять.
Он может дать ссылку на объект, который содержит данные, но с контентом которого он не заботится.
Он может хранить информацию в изменяемом объекте, о котором знает предполагаемый получатель данных (обычно один из этих получателей данных).
Он может возвращать ссылку на неизменяемый объект, содержащий информацию.
Из этих методов, # 4, на сегодняшний день является самым простым. Во многих случаях изменяемые объекты легче работать с ними, чем с неизменяемыми, но нет простого способа поделиться с "ненадежным" кодом информацией о том, что в изменяемом объекте без необходимости сначала копировать информацию в другое. Напротив, информация, хранящаяся в неизменяемом объекте, к которому можно получить ссылку, может быть легко разделена путем простого обмена копией этой ссылки.