Ответ один:
Один из самых популярных вопросов на собеседованиях по Java: Что такое неизменяемый объект (неизменяемый объект), каковы преимущества неизменяемых объектов и при каких обстоятельствах его следует использовать? Или, более конкретно, почему классу String в Java следует присвоить значение? неизменяемый тип?
Неизменяемые объекты, как следует из названия, — это объекты, которые нельзя изменить после создания. Типичным примером является класс String в Java.
Скопируйте код кода следующим образом:
Строка s = "ABC";
s.toLowerCase();
Как и выше, s.toLowerCase() не меняет значение «ABC», а создает новый строковый класс «abc», а затем указывает новый экземпляр на переменную s.
Неизменяемые объекты имеют множество преимуществ перед изменяемыми объектами:
1). Неизменяемые объекты могут повысить эффективность и безопасность пула строк. Если вы знаете, что объект неизменяем, то когда вам нужно скопировать содержимое объекта, вам нужно копировать не сам объект, а только его адрес. Копирование адреса (обычно размером с указатель) требует очень мало памяти. и очень эффективен. Это не повлияет на другие переменные, которые одновременно ссылаются на этот «ABC».
2) Неизменяемые объекты безопасны для многопоточности, поскольку, когда несколько потоков выполняются одновременно, значение изменяемого объекта может быть изменено другими процессами, что приведет к непредсказуемым результатам, а использование неизменяемых объектов - это. ситуации можно избежать.
Конечно, есть и другие причины, но главная причина, по которой Java делает String неизменяемым, — это эффективность и безопасность.
Ответ второй:
Это старый, но все еще популярный вопрос. Создание неизменяемых строк в Java является результатом учета различных факторов. Чтобы понять эту проблему, вам необходимо интегрировать память, синхронизацию и данные. , я подведу итог по разным причинам.
1. Необходимость пула строковых констант
Пул строковых констант (пул строк, внутренний пул строк, пул хранения строк) — это специальная область хранения в кучной памяти Java. Если при создании объекта String строковое значение уже существует в пуле констант, оно не будет создано. объект, а ссылку на существующий объект.
Как показано в следующем коде, в динамической памяти будет создан только один фактический объект String.
Скопируйте код кода следующим образом:
Строка s1 = «abcd»;
Строка s2 = «abcd»;
Принципиальная схема выглядит следующим образом:
Если разрешить изменение строкового объекта, это приведет к различным логическим ошибкам. Например, изменение одного объекта повлияет на другой независимый объект. Строго говоря, идея этого пула констант — это метод оптимизации.
Подумайте: если код выглядит следующим образом, будут ли s1 и s2 указывать на один и тот же фактический объект String?
Скопируйте код кода следующим образом:
Строка s1 = «ab» + «cd»;
Строка s2 = «abc» + «d»;
Возможно, этот вопрос покажется нелогичным для новичков, но, учитывая, что современные компиляторы выполняют регулярные оптимизации, все они будут указывать на один и тот же объект в пуле констант. В качестве альтернативы вы можете использовать такие инструменты, как jd-gui, для просмотра скомпилированного документа класса.
2. Разрешить объектам String кэшировать HashCode.
Хэш-код объектов String в Java часто используется, например, в таких контейнерах, как hashMap.
Неизменяемость строк обеспечивает уникальность хеш-кода, поэтому его можно с уверенностью кэшировать. Это также метод оптимизации производительности, что означает, что нет необходимости каждый раз вычислять новый хеш-код. В определении присутствует следующий код. класса String:
Скопируйте код кода следующим образом:
частный int хэш;//используется для кэширования HashCode
3. Безопасность
String используется в качестве параметра многими классами (библиотеками) Java, такими как URL-адрес адреса сетевого подключения, путь к файлу и параметры String, необходимые для механизма отражения. Если String не исправлен, это может привести к различным угрозам безопасности.
Если есть следующий код:
Скопируйте код кода следующим образом:
логическое соединение (строка s) {
если (!isSecure(s)) {
выбросить новое SecurityException();
}
// Если строку можно изменить в другом месте, здесь возникнут различные непредвиденные проблемы/ошибки.
причинаПроблемы;
}
Вообще говоря, причины, по которым String является неизменяемым, включают соображения дизайна, проблемы оптимизации эффективности и безопасности. Фактически, это также ответ на многие «почему» в интервью по Java.
Ответ 3. Преимущества неизменности класса String
String — наиболее часто используемый класс во всех языках. Мы знаем, что в Java строка является неизменяемой и окончательной. Java также сохраняет пул строк во время выполнения, что делает String специальным классом.
Преимущества неизменности класса String
1. Объединение строк возможно только в том случае, если строки неизменяемы. Реализация пула строк может сэкономить много места в куче во время выполнения, поскольку разные строковые переменные указывают на одну и ту же строку в пуле. Но если строка является переменной, то интернирование String будет невозможно (Примечание переводчика: интернирование String означает, что сохраняется только одна другая строка, то есть несколько одинаковых строк не будут сохранены.), поскольку в этом случае, если переменная меняет свое значение, изменятся и значения других переменных, указывающих на это значение.
2. Если строка является переменной, это вызовет серьезные проблемы с безопасностью. Например, имя пользователя и пароль базы данных передаются в виде строк для получения соединения с базой данных, а при программировании сокетов имя хоста и порт передаются в виде строк. Поскольку строка является неизменяемой, ее значение невозможно изменить, иначе хакеры могут воспользоваться лазейками и изменить значение объекта, на который указывает строка, что приведет к уязвимости безопасности.
3. Поскольку строки неизменяемы, они безопасны в многопоточном режиме, и один и тот же экземпляр строки может использоваться несколькими потоками. Это устраняет необходимость использования синхронизации из-за проблем с потокобезопасностью. Сами строки потокобезопасны.
4. Загрузчики классов используют строки, а неизменяемость обеспечивает безопасность, позволяя загрузить правильный класс. Например, если вы хотите загрузить класс java.sql.Connection и это значение будет изменено на myhacked.Connection, это приведет к неизвестному повреждению вашей базы данных.
5. Поскольку строка является неизменяемой, хеш-код кэшируется при создании и не требует пересчета. Это делает строки очень подходящими в качестве ключей в Картах, и строки можно обрабатывать быстрее, чем другие ключевые объекты. Вот почему ключи в HashMap часто используют строки.
Вышеизложенное представляет собой краткое изложение преимуществ неизменяемости строк.