logo

Чому String є незмінним або остаточним у Java

В об'єктно-орієнтованому програмуванні незмінний рядок або об'єкти який не можна змінювати після створення. Але ми можемо лише змінити посилання на об’єкт. Ми обмежуємося зміною самого об'єкта. The Рядок незмінний в Java через безпеку, синхронізацію та паралельність, кешування та завантаження класів. Причина того, щоб зробити рядок остаточним, полягає в тому, щоб знищити незмінність і не дозволити іншим розширювати її.

Рядок java містить

Об’єкти String кешуються в пулі String, і це робить Рядок незмінний . Кілька клієнтів мають доступ до кешованих рядкових літералів. Отже, завжди існує ризик, коли дія, яку виконує один клієнт, впливає на всіх інших клієнтів. Наприклад, якщо один клієнт виконує дію та змінює значення рядка з Pressure на PRESSURE, усі решта клієнтів також читатимуть це значення. З міркувань продуктивності кешування об’єктів String було важливим, тому, щоб усунути цей ризик, ми повинні зробити String Immutable.

Чому String є незмінним або остаточним у Java

Ось ще кілька причин, чому потрібно зробити String незмінним:

  • Пул String неможливий, якщо String не є незмінним у Java. Зберігається багато місця в купі JRE . На ту саму рядкову змінну може посилатися більше ніж одна рядкова змінна в пулі. Інтернування рядка також неможливе, якщо рядок не буде незмінним.
  • Якщо ми не зробимо рядок незмінним, це створить серйозну загрозу безпеці програми. Наприклад, імена користувачів і паролі бази даних передаються як рядки для отримання підключень до бази даних. The програмування сокетів описи хостів і портів також передаються як рядки. Рядок незмінний, тому його значення не можна змінити. Якщо рядок не залишається незмінним, будь-який хакер може спричинити проблему безпеки в програмі, змінивши значення посилання.
  • Рядок безпечний для багатопоточності через його незмінність. Різні потоки можуть отримати доступ до одного 'примірника рядка'. Він усуває синхронізацію для безпеки потоків, оскільки ми неявно робимо рядки потокобезпечними.
  • Незмінність забезпечує безпеку завантаження правильного класу за допомогою Classloader. Наприклад, припустімо, що ми намагаємося завантажити клас java.sql.Connection, але зміни в значенні, на яке посилається клас myhacked.Connection, завдають небажаних дій нашій базі даних.

Давайте зрозуміємо концепцію immutable на прикладі.

ImmutableString.java

fmovies Індія
 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } } 

Вихід:

Чому String є незмінним або остаточним у Java

опис: Ми можемо зрозуміти наведений вище приклад за допомогою наступної діаграми:

Чому String є незмінним або остаточним у Java

У пулі констант рядків, Привіт залишається незмінним, і створюється новий рядковий об’єкт Привіт Світ . Це показує, що рядки незмінні. Посилальна змінна вказує на Привіт не до Привіт Світ.

Якщо ми хочемо, щоб це посилалося на Привіт Світ , ми повинні явно призначити його цій змінній. Наприклад:

обмеження електронного банкінгу
 import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } } 

Вихід:

Чому String є незмінним або остаточним у Java