In der objektorientierten Programmierung ist die unveränderliche Zeichenfolge oder Objekte die nach ihrer Erstellung nicht mehr geändert werden kann. Wir können aber nur den Verweis auf das Objekt ändern. Wir beschränken uns darauf, das Objekt selbst zu ändern. Der String ist unveränderlich In Java aufgrund der Sicherheit, Synchronisation und Parallelität, Caching und Klassenladen. Der Grund, eine Zeichenfolge endgültig zu machen, besteht darin, die Unveränderlichkeit zu zerstören und anderen nicht zu erlauben, sie zu erweitern.
Die String-Objekte werden im String-Pool zwischengespeichert und dadurch erstellt String unveränderlich . Auf die zwischengespeicherten String-Literale wird von mehreren Clients zugegriffen. Es besteht also immer das Risiko, dass sich die von einem Client ausgeführte Aktion auf alle anderen Clients auswirkt. Wenn beispielsweise ein Client eine Aktion ausführt und den Zeichenfolgewert von Pressure in PRESSURE ändert, lesen alle verbleibenden Clients diesen Wert ebenfalls. Aus Leistungsgründen war das Zwischenspeichern von String-Objekten wichtig. Um dieses Risiko zu beseitigen, müssen wir den String unveränderlich machen.
Dies sind einige weitere Gründe, String unveränderlich zu machen:
- Der String-Pool ist nicht möglich, wenn String in Java nicht unveränderlich ist. Dadurch wird viel Heap-Speicherplatz gespart JRE . Auf dieselbe String-Variable kann von mehr als einer String-Variablen im Pool verwiesen werden. Eine String-Internierung kann auch nicht möglich sein, wenn der String nicht unveränderlich wäre.
- Wenn wir den String nicht unveränderlich machen, stellt dies eine ernsthafte Sicherheitsbedrohung für die Anwendung dar. Beispielsweise werden Datenbankbenutzernamen und Passwörter als Zeichenfolgen übergeben, um Datenbankverbindungen zu empfangen. Der Socket-Programmierung Host- und Portbeschreibungen werden ebenfalls als Strings übergeben. Der String ist unveränderlich, daher kann sein Wert nicht geändert werden. Wenn der String nicht unveränderlich bleibt, kann jeder Hacker ein Sicherheitsproblem in der Anwendung verursachen, indem er den Referenzwert ändert.
- Der String ist aufgrund seiner Unveränderlichkeit sicher für Multithreading. Verschiedene Threads können auf eine einzelne „String-Instanz“ zugreifen. Dadurch wird die Synchronisierung für die Thread-Sicherheit entfernt, da wir Zeichenfolgen implizit threadsicher machen.
- Unveränderlichkeit gibt die Sicherheit, dass Classloader die richtige Klasse lädt. Angenommen, wir haben eine Instanz, in der wir versuchen, die Klasse java.sql.Connection zu laden, aber die Änderungen am referenzierten Wert der Klasse myhacked.Connection führen zu unerwünschten Auswirkungen auf unsere Datenbank.
Lassen Sie uns das Konzept der Unveränderlichkeit anhand eines Beispiels verstehen.
ImmutableString.java
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString.concat('World'); System.out.println(NewString); } }
Ausgabe:
Beschreibung: Wir können das obige Beispiel anhand des folgenden Diagramms verstehen:
Im String-Konstantenpool ist die Hallo bleibt unverändert und es wird ein neues String-Objekt mit erstellt Hallo Welt . Es zeigt, dass die Zeichenfolgen unveränderlich sind. Die Referenzvariable zeigt auf die Hallo nicht zum Hallo Welt.
Wenn wir wollen, dass es sich auf das bezieht Hallo Welt , müssen wir es dieser Variablen explizit zuweisen. Zum Beispiel:
import java.util.*; class ImmutableString{ public static void main(String args[]){ String NewString = 'Hello'; NewString = NewString.concat('World'); System.out.println(NewString); } }
Ausgabe: