Почему неизменяемая строка более эффективна по сравнению с изменяемой

Я где-то читал в книге, что неизменяемая строка может быть реализована более эффективно, чем изменяемая.

Насколько неизменяемая строка более эффективна по сравнению с изменяемой?

Я имею в виду, в чем разница между неизменяемой и изменяемой строкой, которая делает неизменяемую строку более эффективной...??


person uveng    schedule 24.05.2014    source источник
comment
У вас есть некоторые несоответствия в вашем вопросе/заголовке, которые вы, возможно, захотите прояснить... Изменчивость означает то же самое, что и изменчивость.   -  person awksp    schedule 24.05.2014
comment
Какая книга и каков был контекст? Более эффективное внедрение может означать многое. Абсолютно проще реализовать базовый класс, такой как String, неизменяемым образом: требуется меньше кода, избежать головной боли с гонками данных в многопоточном программировании, проще реализовать надежные проверки безопасности и т. д. Или вы означает более эффективное выполнение?   -  person Erwin Bolwidt    schedule 24.05.2014
comment
Полный справочник, 7-е издание, стр. №: 359.   -  person uveng    schedule 24.05.2014
comment
да, я спрашиваю о более эффективном выполнении.   -  person uveng    schedule 24.05.2014


Ответы (4)


Читайте здесь.

Как изменяемые, так и неизменяемые объекты имеют свои особенности использования, плюсы и минусы.

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

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

Более того, наше восприятие реального мира неизбежно основано на изменчивых объектах. Когда вы заправляете свой автомобиль топливом на заправке, вы все время воспринимаете его как один и тот же объект (т. е. его идентичность сохраняется при изменении его состояния), а не как если бы старый автомобиль с пустым баком последовательно заменялся новым. автомобильные экземпляры, у которых их бак постепенно становится все более и более полным. Таким образом, всякий раз, когда мы моделируем какую-либо предметную область в программе, обычно проще реализовать модель предметной области, используя изменяемые объекты для представления сущностей реального мира.

person Achintya Jha    schedule 24.05.2014

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

person Mikayla Maki    schedule 24.05.2014

Я не скажу, что неизменяемые объекты более эффективны; это предпочтительнее, хотя и не так эффективно, как изменяемые объекты

плюсы

  • Простой в обслуживании
  • Поток безопасный

Простота обслуживания означает, что после создания неизменяемого объекта его состояние не может быть изменено (по ошибке), когда вы передаете его на несколько бизнес-уровней; поэтому он уменьшает количество дефектов, связанных с неправильным изменением состояния

Вы также можете совместно использовать неизменяемый объект в многопоточной среде, не беспокоясь о конфликтах данных, поскольку состояние объекта нельзя изменить.

например: BigDecimal

Минусы

  • Влияние на производительность

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

например: BigDecimal.ZERO

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

person Kalyan    schedule 24.05.2014

Неизменяемость строк позволяет делиться ими, это более эффективно с точки зрения памяти.

person Evgeniy Dorofeev    schedule 24.05.2014