Почему класс String был разработан таким образом? - PullRequest
2 голосов
/ 14 сентября 2011

Почему класс String был спроектирован таким образом, что экземпляры этого класса объединяются и являются неизменными?

Спасибо и С уважением, Видьякар Шарма.

Ответы [ 5 ]

6 голосов
/ 14 сентября 2011

Строковые объекты обычно не обычно объединяются - только строки константы объединяются автоматически через интернирование.(Конечно, вы можете вызвать intern вручную или даже создать свои собственные пулы с помощью HashSet<String> и т. Д.) Это безопасно , потому что строки являются неизменяемыми - и имеет смысл убедиться, что любая компиляцияпостоянная времени встречается в памяти только один раз.

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

3 голосов
/ 14 сентября 2011

Если бы String не был неизменным, вы не смогли бы

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

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

2 голосов
/ 14 сентября 2011

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

Если вы хотите, чтобы изменяемые строки были проверены: StringBuffer и StringBuilder

1 голос
/ 14 сентября 2011

для изменяемых строк: StringBuffer и StringBuilder из java.lang

0 голосов
/ 14 сентября 2011

Объединено, чтобы избежать дублирования объектов, которые представляют одно и то же.

Неизменным, чтобы было легче поделиться им.

...