Почему строка неизменяема в Java?

Почему String является неизменным в Java – один из популярных вопросов на собеседованиях. Строка – один из наиболее используемых классов в любом языке программирования. Мы знаем, что String является неизменным и окончательным в Java. Java Runtime поддерживает пул строк, что делает его особым классом.

Почему String неизменен в Java?

Давайте рассмотрим несколько преимуществ неизменности String, что поможет понять, почему String неизменен в Java.

  1. Пул строк возможен только потому, что String неизменен в Java. Таким образом, Java Runtime экономит много памяти кучи, потому что различные переменные String могут ссылаться на одну и ту же переменную String в пуле. Если бы String был изменяемым, то интернирование строк не было бы возможным, потому что любое изменение значения переменной отразилось бы и на других переменных.
  2. Если String не является неизменным, то это может вызвать серьезные угрозы безопасности для приложения. Например, имя пользователя и пароль для доступа к базе данных передаются как String для установки соединения с базой данных, а в программировании сокетов детали хоста и порта также передаются как String. Поскольку String является неизменным, его значение нельзя изменить, в противном случае злоумышленник может изменить ссылочное значение, что может привести к проблемам с безопасностью в приложении.
  3. Поскольку String является неизменным, он безопасен для многозадачности. Один экземпляр String может быть общим для разных потоков. Это избегает использование синхронизации для обеспечения безопасности потоков. Строки являются неявно потокобезопасными.
  4. Строки используются в загрузчике классов Java, и их неизменность обеспечивает безопасность загрузки правильного класса загрузчиком классов. Например, представьте себе ситуацию, когда вы пытаетесь загрузить класс java.sql.Connection, но ссылочное значение изменено на класс myhacked.Connection, который может выполнять нежелательные действия с вашей базой данных.
  5. Поскольку String неизменен, его хеш-код кешируется при создании, и его не нужно вычислять снова. Это делает его отличным кандидатом для ключа в Map, и его обработка быстрее, чем у других объектов ключей HashMap. Поэтому String является наиболее широко используемым ключом HashMap.

Выше перечислены некоторые причины, которые, на мой взгляд, демонстрируют преимущества неизменяемости строк. Это великая особенность класса Java String и делает его особенным. Прочтите этот пост, чтобы узнать, как написать ваш собственный неизменяемый класс.

Больше примеров использования Java String вы можете найти в нашем репозитории GitHub.

Source:
https://www.digitalocean.com/community/tutorials/string-immutable-final-java