польза от создания строки как неизменной была для функции безопасности.Читайте ниже
Почему 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).