Когда-то я изучал преимущества неизменной строки из-за чего-то, чтобы улучшить производительность в памяти.В чем преимущество непрерывности String?
Может кто-нибудь объяснить это мне? Я не могу найти его в Интернете.
Когда-то я изучал преимущества неизменной строки из-за чего-то, чтобы улучшить производительность в памяти.В чем преимущество непрерывности String?
Может кто-нибудь объяснить это мне? Я не могу найти его в Интернете.
Неизменяемые строки дешевы для копирования, поскольку вам не нужно копировать все данные - просто скопируйте ссылку или указатель на данные.
Неизменяемые классы любого типа легче работать с несколькими потоками, единственная синхронизация, необходимая для уничтожения.
Рассмотрите альтернативу. Java не имеет определителя констант. Если объекты String были изменены, то любой метод, которому вы передаете ссылку на строку, может иметь побочный эффект изменения строки. Неизменяемые строки устраняют необходимость в защитных копиях и уменьшают риск ошибки программы.
Неизменность (для строк или других типов) могут иметь многочисленные преимущества:
Неизменяемые строки также помогают избежать искушения использовать строки в качестве буферов. Многие недостатки в программах на C/C++ связаны с проблемами переполнения буфера, возникающими в результате использования массивов голых символов для составления или изменения строковых значений. Обработка строк как изменчивых типов поощряет использование типов, более подходящих для манипуляции с буфером (см. StringBuilder
в .NET или Java).
Но если вы используете парадигму [Copy-On-Write] (http://en.wikipedia.org/wiki/Copy-on-write), у вас есть преимущества непреложных строк * и * личных копий и на месте модификация, если необходимо, например для быстрого анализа. «StringBuilder» - это всего лишь обходное решение для замедления непреложной конкатенации строк и небольшой пользы в отношении шаблона COW, связанного с эффективной системой управления кучей. COW позволяет обеспечить безопасный доступ к вашему буферу * и * быстро в одно и то же время. –
Некоторые из этих аргументов кажутся запутанными параметрами «const» (такими же, как Java «final») с неизменностью упомянутых объектов. –
@LBushkin. Несмотря на то, что вы делаете некоторые аргументы в своих пунктах, ваш пункт «Неизменяемые строки также помогают избежать ...» является вводящим в заблуждение. StringBuilder решает совершенно другую проблему, чем переполнение буфера в C - это просто оптимизация для конкатенации строк, поскольку конкатенация неизменяемых строк происходит медленно - вам нужно создать два новых объекта и скопировать все символы для каждого шага конкатенации. – Alexey
Подумайте о различных струнах, сидящих на общем бассейне. Затем переменные String указывают на местоположения в пуле. Если и скопировать строковую переменную, то и оригинал и копия имеет те же символы. Эта эффективность обмена перевешивает неэффективность редактирования строк путем извлечения подстрок и конкатенации.
a) Представьте себе объект StringPool, не делая строку неизменной, ее невозможно вообще, поскольку в случае пула строк один строковый объект/литерал, например. «Тест» ссылается на множество ссылочных переменных, поэтому, если какой-либо из них изменит значение, то другие будут автоматически затронуты, т. Е. Скажем Строка A = «Тест» и строка B = «Тест» Теперь String B называется «Test» .toUpperCase(), которые изменяют один и тот же объект в «TEST», поэтому A также будет «TEST», что нежелательно.
b) Еще одна причина того, почему String неизменна в Java, - это позволить String кэшировать свой хэш-код, будучи неизменяемым. String в Java кэширует свой хэш-код и не вычисляет каждый раз, когда мы вызываем метод hashcode String, что делает его очень быстрым, как hashmap ключ.
Возможно, мой ответ устарел, но, вероятно, кто-то найдет здесь новую информацию.
Почему Java Строка неизменна и почему это хорошо:
Фундаментально, если один объект или метод желает передать информацию другим есть несколько способов, он может сделать это:
это может дать ссылку на изменяемый объект, который содержит информацию, и которую получатель обещает не изменять.
Он может дать ссылку на объект, который содержит данные, но с контентом которого он не заботится.
Он может хранить информацию в изменяемом объекте, о котором знает предполагаемый получатель данных (как правило, он предоставляется этим получателем данных).
Он может возвращать ссылку на неизменяемый объект, содержащий информацию.
Из этих методов # 4 является самым простым. Во многих случаях изменчивые объекты легче работать с чем неизменяемыми, , но нет простого способа поделиться с «ненадежным» кодом информацией, находящейся в изменяемом объекте, без необходимости сначала копировать информацию в другое. Напротив, информация, содержащаяся в неизменяемом объекте, к которому можно получить ссылку, может быть легко разделена путем простого обмена копией этой ссылки.
Возможный дубликат [Что подразумевается под неизменным?] (Http://stackoverflow.com/questions/279507/what-is-meant-by-immutable). Хотя название этого вопроса не одно и то же, оно включает вопрос о преимуществах и недостатках, которые, по крайней мере, один из ответов (по Имагисту) достаточно хорошо освещен. –