Почему String является неизменным в Java – один из популярных вопросов на собеседованиях. Строка – один из наиболее используемых классов в любом языке программирования. Мы знаем, что String является неизменным и окончательным в Java. Java Runtime поддерживает пул строк, что делает его особым классом.
Почему String неизменен в Java?
Давайте рассмотрим несколько преимуществ неизменности String, что поможет понять, почему String неизменен в Java.
- Пул строк возможен только потому, что String неизменен в Java. Таким образом, Java Runtime экономит много памяти кучи, потому что различные переменные String могут ссылаться на одну и ту же переменную String в пуле. Если бы String был изменяемым, то интернирование строк не было бы возможным, потому что любое изменение значения переменной отразилось бы и на других переменных.
- Если String не является неизменным, то это может вызвать серьезные угрозы безопасности для приложения. Например, имя пользователя и пароль для доступа к базе данных передаются как String для установки соединения с базой данных, а в программировании сокетов детали хоста и порта также передаются как String. Поскольку String является неизменным, его значение нельзя изменить, в противном случае злоумышленник может изменить ссылочное значение, что может привести к проблемам с безопасностью в приложении.
- Поскольку String является неизменным, он безопасен для многозадачности. Один экземпляр String может быть общим для разных потоков. Это избегает использование синхронизации для обеспечения безопасности потоков. Строки являются неявно потокобезопасными.
- Строки используются в загрузчике классов Java, и их неизменность обеспечивает безопасность загрузки правильного класса загрузчиком классов. Например, представьте себе ситуацию, когда вы пытаетесь загрузить класс
java.sql.Connection
, но ссылочное значение изменено на классmyhacked.Connection
, который может выполнять нежелательные действия с вашей базой данных. - Поскольку String неизменен, его хеш-код кешируется при создании, и его не нужно вычислять снова. Это делает его отличным кандидатом для ключа в Map, и его обработка быстрее, чем у других объектов ключей HashMap. Поэтому String является наиболее широко используемым ключом HashMap.
Выше перечислены некоторые причины, которые, на мой взгляд, демонстрируют преимущества неизменяемости строк. Это великая особенность класса Java String и делает его особенным. Прочтите этот пост, чтобы узнать, как написать ваш собственный неизменяемый класс.
Больше примеров использования Java String вы можете найти в нашем репозитории GitHub.
Source:
https://www.digitalocean.com/community/tutorials/string-immutable-final-java