В чем преимущество неизменности String? - PullRequest
20 голосов
/ 04 августа 2010

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

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

Ответы [ 7 ]

34 голосов
/ 04 августа 2010

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

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

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

9 голосов
/ 04 августа 2010

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

5 голосов
/ 04 августа 2010

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

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

0 голосов
/ 28 апреля 2014

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

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

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

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

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

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

0 голосов
/ 10 ноября 2012

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

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

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

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

0 голосов
/ 12 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...