Antwort eins:
Eine der beliebtesten Java-Interviewfragen lautet: Was ist ein unveränderliches Objekt (unveränderliches Objekt), welche Vorteile hat ein unveränderliches Objekt und unter welchen Umständen sollte es verwendet werden? Oder genauer gesagt: Warum sollte die String-Klasse von Java auf ein festgelegt werden? unveränderlicher Typ?
Unveränderliche Objekte sind, wie der Name schon sagt, Objekte, die nach der Erstellung nicht geändert werden können. Ein typisches Beispiel ist die String-Klasse in Java.
Kopieren Sie den Codecode wie folgt:
Zeichenfolge s = "ABC";
s.toLowerCase();
Wie oben ändert s.toLowerCase() nicht den Wert von „ABC“, sondern erstellt eine neue String-Klasse „abc“ und verweist dann die neue Instanz auf die Variable s.
Unveränderliche Objekte haben gegenüber veränderlichen Objekten viele Vorteile:
1) Unveränderliche Objekte können die Effizienz und Sicherheit von String Pool verbessern. Wenn Sie wissen, dass ein Objekt unveränderlich ist, müssen Sie beim Kopieren des Inhalts des Objekts nicht es selbst, sondern nur seine Adresse kopieren. Das Kopieren der Adresse (normalerweise die Größe eines Zeigers) erfordert sehr wenig Speicher und ist sehr effizient. Es hat keinen Einfluss auf andere Variablen, die gleichzeitig auf dieses „ABC“ verweisen.
2) Unveränderliche Objekte sind für Multithreads sicher, denn wenn mehrere Threads gleichzeitig ausgeführt werden, kann der Wert eines veränderlichen Objekts durch andere Prozesse geändert werden, was zu unvorhersehbaren Ergebnissen führt, und die Verwendung unveränderlicher Objekte ist dies Situation vermieden werden kann.
Natürlich gibt es noch andere Gründe, aber der Hauptgrund, warum Java String auf unveränderlich setzt, ist Effizienz und Sicherheit.
Antwort zwei:
Dies ist eine alte, aber immer noch beliebte Frage. Das Ergebnis der Berücksichtigung verschiedener Faktoren ist, dass Sie im Folgenden Struktur- und Sicherheitsaspekte berücksichtigen müssen Ich werde verschiedene Gründe zusammenfassen.
1. Die Notwendigkeit eines String-Konstantenpools
Der String-Konstantenpool (String-Pool, String-Intern-Pool, String-Retention-Pool) ist ein spezieller Speicherbereich im Java-Heapspeicher. Wenn der String-Wert bereits im Konstantenpool vorhanden ist, wird er nicht erstellt Objekt, sondern eine Referenz auf ein vorhandenes Objekt.
Wie im folgenden Code gezeigt, wird nur ein tatsächliches String-Objekt im Heap-Speicher erstellt.
Kopieren Sie den Codecode wie folgt:
String s1 = „abcd“;
String s2 = „abcd“;
Das schematische Diagramm sieht wie folgt aus:
Wenn sich das String-Objekt ändern darf, führt dies zu verschiedenen logischen Fehlern. Beispielsweise wirkt sich die Änderung eines Objekts auf ein anderes unabhängiges Objekt aus. Genau genommen handelt es sich bei der Idee dieses Konstantenpools um eine Optimierungsmethode.
Denken Sie bitte darüber nach: Wenn der Code wie folgt lautet, verweisen s1 und s2 dann immer noch auf dasselbe tatsächliche String-Objekt?
Kopieren Sie den Codecode wie folgt:
String s1= „ab“ + „cd“;
String s2= „abc“ + „d“;
Vielleicht ist diese Frage für Anfänger nicht intuitiv, aber wenn man bedenkt, dass moderne Compiler regelmäßig Optimierungen durchführen, verweisen sie alle auf dasselbe Objekt im Konstantenpool. Alternativ können Sie Tools wie jd-gui verwenden, um das kompilierte Klassendokument anzuzeigen.
2. Erlauben Sie String-Objekten, HashCode zwischenzuspeichern
Der Hash-Code von String-Objekten in Java wird häufig verwendet, beispielsweise in Containern wie hashMap.
Die Unveränderlichkeit der Zeichenfolge stellt die Einzigartigkeit des Hash-Codes sicher, sodass er sicher zwischengespeichert werden kann. Dies ist auch eine Methode zur Leistungsoptimierung, was bedeutet, dass nicht jedes Mal ein neuer Hash-Code berechnet werden muss. Die Definition enthält den folgenden Code der String-Klasse:
Kopieren Sie den Codecode wie folgt:
private int hash;//wird zum Zwischenspeichern von HashCode verwendet
3. Sicherheit
String wird von vielen Java-Klassen (Bibliotheken) als Parameter verwendet, z. B. als Netzwerkverbindungsadressen-URL, Dateipfad und String-Parameter, die für den Reflexionsmechanismus erforderlich sind. Wenn String nicht festgelegt ist, führt dies zu verschiedenen Sicherheitsrisiken.
Wenn es den folgenden Code gibt:
Kopieren Sie den Codecode wie folgt:
boolean connect(string s){
if (!isSecure(s)) {
throw new SecurityException();
}
// Wenn String an anderer Stelle geändert werden kann, treten hier verschiedene unerwartete Probleme/Fehler auf.
UrsacheProblem(e);
}
Im Allgemeinen sind die Gründe, warum String unveränderlich ist, Designüberlegungen, Effizienzoptimierungsprobleme und Sicherheit. Tatsächlich ist dies auch die Antwort auf viele „Warum“ in Java-Interviews.
Antwort 3: Vorteile der Unveränderlichkeit der String-Klasse
String ist die am häufigsten verwendete Klasse in allen Sprachen. Wir wissen, dass String in Java unveränderlich und endgültig ist. Außerdem speichert Java zur Laufzeit einen String-Pool, was String zu einer besonderen Klasse macht.
Vorteile der Unveränderlichkeit der String-Klasse
1. String-Pooling ist nur möglich, wenn Strings unveränderlich sind. Durch die Implementierung des String-Pools kann zur Laufzeit viel Heap-Speicherplatz eingespart werden, da verschiedene String-Variablen auf denselben String im Pool verweisen. Wenn die Zeichenfolge jedoch variabel ist, ist die Internierung von Zeichenfolgen nicht möglich (Anmerkung des Übersetzers: Internierung von Zeichenfolgen bedeutet, dass nur eine unterschiedliche Zeichenfolge gespeichert wird, d. h. es werden nicht mehrere identische Zeichenfolgen gespeichert.), da in diesem Fall eine Variable vorliegt Wenn sich der Wert ändert, ändern sich auch die Werte anderer Variablen, die auf diesen Wert verweisen.
2. Wenn die Zeichenfolge variabel ist, führt dies zu ernsthaften Sicherheitsproblemen. Beispielsweise werden der Benutzername und das Passwort der Datenbank als Zeichenfolgen übergeben, um die Datenbankverbindung herzustellen, oder bei der Socket-Programmierung werden der Hostname und der Port als Zeichenfolgen übergeben. Da eine Zeichenfolge unveränderlich ist, kann ihr Wert nicht geändert werden. Andernfalls können Hacker Lücken ausnutzen und den Wert des Objekts, auf das die Zeichenfolge zeigt, ändern, was zu einer Sicherheitslücke führt.
3. Da Zeichenfolgen unveränderlich sind, sind sie Multithread-sicher und dieselbe Zeichenfolgeninstanz kann von mehreren Threads gemeinsam genutzt werden. Dadurch entfällt die Notwendigkeit, die Synchronisierung aufgrund von Thread-Sicherheitsproblemen zu verwenden. Strings selbst sind threadsicher.
4. Klassenlader verwenden Zeichenfolgen und Unveränderlichkeit sorgt für Sicherheit, sodass die richtige Klasse geladen wird. Wenn Sie beispielsweise die Klasse java.sql.Connection laden möchten und dieser Wert in myhacked.Connection geändert wird, führt dies zu unbekannten Schäden an Ihrer Datenbank.
5. Da die Zeichenfolge unveränderlich ist, wird der Hashcode bei seiner Erstellung zwischengespeichert und muss nicht neu berechnet werden. Dadurch eignen sich Strings sehr gut als Schlüssel in Maps und können schneller verarbeitet werden als andere Schlüsselobjekte. Aus diesem Grund verwenden die Schlüssel in HashMap häufig Zeichenfolgen.
Das Obige ist meine Zusammenfassung der Vorteile der String-Unveränderlichkeit.