Почему строка неизменяема в Java?
Почему String неизменяем в Java — один из популярных вопросов на собеседованиях. Строка является одним из наиболее часто используемых классов в любом языке программирования. Мы знаем, что String неизменяем и окончательный в Java. Среда выполнения Java поддерживает пул строк, что делает его особым классом.
Почему String неизменяем в Java?
- пространство в куче, поскольку разные строковые переменные могут ссылаться на одну и ту же строковую переменную в пуле. Если бы String не была неизменяемой, интернирование String было бы невозможно, потому что, если бы какая-либо переменная изменила значение, это отразилось бы и на других переменных.
- Если String не является неизменным, это может создать серьезную угрозу безопасности приложения. Например, имя пользователя базы данных и пароль передаются в виде строки для подключения к базе данных, а сведения о хосте и порте для программирования сокетов передаются в виде строки. Поскольку String является неизменяемым, его значение нельзя изменить, иначе любой хакер может изменить указанное значение, что вызовет проблемы с безопасностью в приложении.
- Поскольку String неизменяем, он безопасен для многопоточности. Один экземпляр String может использоваться в разных потоках. Это позволяет избежать использования синхронизации для обеспечения безопасности потоков. Строки неявно потокобезопасны.
- Строки используются в загрузчике классов Java, а неизменяемость обеспечивает уверенность в том, что правильный класс загружается загрузчиком классов. Например, подумайте о случае, когда вы пытаетесь загрузить класс
java.sql.Connection
, но ссылочное значение изменяется на классmyhacked.Connection
, который может делать нежелательные вещи для ваша база данных. - Поскольку String неизменяем, его хэш-код кэшируется во время создания, и его не нужно вычислять повторно. Это делает его отличным кандидатом на роль ключа в карте, и его обработка выполняется быстрее, чем другие ключевые объекты HashMap. Вот почему String чаще всего используется в качестве ключей HashMap.
Выше приведены некоторые из причин, которые я мог придумать, которые показывают преимущества неизменности строк. Это замечательная особенность неизменяемого класса.
Вы можете проверить больше примеров Java String в нашем репозитории GitHub.