Струнный бассейн в Яве - PullRequest
9 голосов
/ 09 января 2012

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

Но мой вопрос стоит -

Зачем нужно было делать String POOL?

Почему строковый класс не был сохранен как другие классы для хранения своих собственных значений?

Требуется ли для внутреннего использования JVM какие-либо строки или это выигрыш в производительности. Если да, то как?

Ответы [ 4 ]

6 голосов
/ 09 января 2012

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

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

Обратите внимание, что класс String не отличается от других классов: он содержит свой собственный массив символов. Он также может делиться им с другими экземплярами String, когда вызывается подстрока.

2 голосов
/ 09 января 2012

См. Следующие ссылки:

Вопросы о пуле строк Java

Некоторые запросы относительно пула строк Java

В отношении пула констант Java String

и вы получите ответ.

В одном предложении ответ to use JVM memory cleaverly

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

польза от создания строки как неизменной была для функции безопасности.Читайте ниже

Почему String стал неизменным в Java?

Хотя производительность также является причиной (если вы уже знаете о внутреннем пуле String, который поддерживается для того, чтобы убедиться, что тот же объект Stringиспользуется более одного раза без необходимости создавать / повторно запрашивать его много раз), но главная причина, по которой String стала неизменной в Java, - это «Безопасность».Удивлены?Давайте поймем, почему.

Предположим, вам нужно открыть защищенный файл, который требует от пользователей аутентификации.Допустим, есть два пользователя с именами 'user1' и 'user2', и у них есть свои собственные файлы паролей 'password1' и 'password2' соответственно.Очевидно, что 'user2' не должен иметь доступа к файлу 'password1'.

Как мы знаем, имена файлов в Java указываются с помощью Strings.Даже если вы создаете объект File, вы передаете имя файла только как String, и эта String поддерживается внутри объекта File как один из его членов.

Если бы String был изменяемым, 'user1'мог войти в систему, используя свои учетные данные, а затем каким-то образом мог бы изменить имя своего имени файла пароля (объект String) с 'password1' на 'password2' до того, как JVM фактически установит системный вызов собственной ОС для открытия файла.Это позволило бы 'user1' открыть файл паролей user2.Понятно, что это привело бы к большой уязвимости в Java.Я понимаю, что здесь так много «могло бы быть», но вы наверняка согласитесь, что это открыло бы дверь, позволяющую разработчикам испортить безопасность многих ресурсов, преднамеренно или неумышленно.

С неизменяемостью строкJVM может быть уверен, что член экземпляра имени файла соответствующего объекта File будет продолжать указывать на тот же неизмененный объект String "filename".Член экземпляра 'filename', являющийся 'final' в классе File, в любом случае нельзя изменить, чтобы он указывал на любой другой объект String, указывающий любой другой файл, кроме предполагаемого (т. Е. Тот, который использовался для создания объекта File).

0 голосов
/ 09 января 2012

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

...