logo

Dlaczego ciąg jest niezmienny lub końcowy w Javie

W programowaniu obiektowym tzw niezmienny ciąg lub obiekty których po utworzeniu nie można modyfikować. Ale możemy zmienić tylko odniesienie do obiektu. Ograniczamy się do zmiany samego obiektu. The Ciąg jest niezmienny W Jawa ze względu na bezpieczeństwo, synchronizację i współbieżność, buforowanie i ładowanie klas. Powodem uczynienia łańcucha ostatecznym jest zniszczenie niezmienności i uniemożliwienie innym jego rozszerzania.

Obiekty String są buforowane w puli String, co sprawia, że Ciąg niezmienny . Dostęp do buforowanych literałów ciągu ma wielu klientów. Dlatego zawsze istnieje ryzyko, że działania jednego klienta będą miały wpływ na wszystkich pozostałych klientów. Na przykład, jeśli jeden klient wykona akcję i zmieni wartość ciągu z Ciśnienie na CIŚNIENIE, wszyscy pozostali klienci również odczytają tę wartość. Ze względu na wydajność ważne było buforowanie obiektów String, więc aby wyeliminować to ryzyko, musimy sprawić, że String będzie niezmienny.

połączenie pd
Dlaczego ciąg jest niezmienny lub końcowy w Javie

Oto kilka innych powodów, dla których String powinien być niezmienny:

  • Pula ciągów nie może być możliwa, jeśli ciąg znaków nie jest niezmienny w Javie. Dużo miejsca na stercie oszczędza się JRE . Do tej samej zmiennej łańcuchowej może odwoływać się więcej niż jedna zmienna łańcuchowa w puli. Internowanie ciągów nie może być również możliwe, jeśli ciąg nie byłby niezmienny.
  • Jeśli nie sprawimy, że String będzie niezmienny, będzie to stanowić poważne zagrożenie bezpieczeństwa aplikacji. Na przykład nazwy użytkowników baz danych i hasła są przekazywane jako ciągi znaków w celu odbierania połączeń z bazą danych. The programowanie gniazd Opisy hostów i portów są również przekazywane jako ciągi znaków. String jest niezmienny, więc jego wartości nie można zmienić. Jeśli ciąg nie pozostanie niezmienny, każdy haker może spowodować problem bezpieczeństwa w aplikacji, zmieniając wartość referencyjną.
  • String jest bezpieczny dla wielowątkowości ze względu na swoją niezmienność. Różne wątki mogą uzyskać dostęp do pojedynczej „instancji String”. Usuwa synchronizację ze względu na bezpieczeństwo wątków, ponieważ domyślnie tworzymy ciągi znaków jako bezpieczne dla wątków.
  • Niezmienność zapewnia bezpieczeństwo załadowania właściwej klasy przez Classloader. Załóżmy na przykład, że mamy instancję, w której próbujemy załadować klasę java.sql.Connection, ale zmiany wartości odniesienia w klasie myhacked.Connection powodują niepożądane skutki w naszej bazie danych.

Rozumiemy koncepcję niezmienności na przykładzie.

Niezmienny ciąg.java

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

Wyjście:

Dlaczego ciąg jest niezmienny lub końcowy w Javie

Opis: Powyższy przykład możemy zrozumieć za pomocą poniższego diagramu:

próba złapania Java
Dlaczego ciąg jest niezmienny lub końcowy w Javie

W puli stałych łańcuchowych, Cześć pozostaje niezmieniony i tworzony jest nowy obiekt typu string Witaj świecie . Pokazuje, że ciągi znaków są niezmienne. Zmienna referencyjna wskazuje na Cześć nie do Witaj świecie.

Jeśli tego chcemy, odnosi się to do Witaj świecie , musimy jawnie przypisać ją do tej zmiennej. Na przykład:

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

Wyjście:

Dlaczego ciąg jest niezmienny lub końcowy w Javie