Warum die String-Klasse in Java unveränderlich ist (ausführliche Erklärung)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];}
Der Wert der String-Klasse ist Wird im Wertarray gespeichert und durch privates Finale
1 geändert. Die private Änderung zeigt an, dass externe Klassen nicht auf den Wert zugreifen können und Unterklassen nicht darauf zugreifen können. Natürlich kann die String-Klasse keine Unterklassen haben, da die Klasse ist endgültig geändert
2. Die endgültige Änderung gibt an, dass die Referenz des Werts nicht geändert wird und der Wert nur im Konstruktor von String initialisiert wird und es keine andere Möglichkeit gibt, den Wert im Array zu ändern Die Referenz und der Wert des Werts ändern sich nicht
Wir sagen also, dass die String-Klasse unveränderlich ist.
Und viele Methoden, wie z. B. Teilzeichenfolgen, arbeiten nicht mit der ursprünglichen String-Klasse, sondern generieren eine neue String-Klasse
public String substring(int beginIndex) { if (beginIndex < 0) { throw new StringIndexOutOfBoundsException(beginIndex); } int subLen = value.length - beginIndex; if (subLen < 0) { throw new StringIndexOutOfBoundsException(subLen); } return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);}
Warum ist String auf „nicht verfügbar“ eingestellt? Geändert?
String-Konstanten-Pool
Java hat 8 grundlegende Datentypen
Integer-Typen: byte, short, int, long. Verpackungstypen sind Byte, Short, Integer, Long
Gleitkommatypen: float, double. Der Verpackungstyp ist Float, Double
Zeichentyp: char. Der Verpackungstyp ist Zeichen
Boolescher Typ: boolean. Der Verpackungstyp ist Boolean
Mit Ausnahme von Float und Double implementieren die 8 Verpackungstypen keine konstanten Pools. Der Rest wird natürlich über den Flyweight-Modus implementiert
String-Klassen-Konstanten werden auf JVM-Ebene implementiert.
Warum gibt es einen konstanten Pool?
Der konstante Pool soll die häufige Erstellung und Zerstörung von Objekten vermeiden, die sich auf die Systemleistung auswirken, und implementiert die gemeinsame Nutzung von Objekten.
Zum Beispiel legt der String-Konstanten-Pool während der Kompilierungsphase alle String-Literale in einen Konstanten-Pool ab.
Speicherplatz sparen: Alle identischen String-Konstanten im Konstantenpool werden zusammengeführt und belegen nur einen Platz.
Laufzeit sparen: Beim Vergleich von Strings ist == schneller als equal(). Verwenden Sie für zwei Referenzvariablen einfach ==, um festzustellen, ob die Referenzen gleich sind, und Sie können auch feststellen, ob die tatsächlichen Werte gleich sind.
Wo ist der String-Konstantenpool?
Ich werde nichts vor jdk1.7 besprechen. Ab jdk1.7 wurde begonnen, den String-Konstantenpool im Heap zu platzieren, und dann basiert der gesamte Inhalt dieses Artikels auf jdk1. 8
Der folgende Code wird immer noch häufig gefragt
String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); // trueSystem.out.println(str1 == str2); // falseSystem.out.println(str1 == str3); // falseSystem.out.println(str3 == str4);
Die Struktur im Speicher ist wie folgt
Der konstante Pool speichert Referenzen
Erklären Sie die Ausgabe des obigen Codes. Es gibt zwei Möglichkeiten, String-Objekte in Java zu erstellen.
String str1 = "abc"; String str2 = "abc"; // trueSystem.out.println(str1 == str2);
Beim Erstellen eines Strings mit einem Literalwert entfernt die JVM zuerst den string Finden Sie heraus, ob das Objekt „abc“ im Pool vorhanden ist
Wenn es nicht existiert, erstellen Sie das Objekt „abc“ im String-Pool und weisen Sie dann die Adresse des Objekts „abc“ im Pool zu str1, so dass str1 Es zeigt auf das Zeichenfolgenobjekt „abc“ im Pool
Wenn es vorhanden ist, wird kein Objekt erstellt und die Adresse des „abc“-Objekts im Pool wird direkt zurückgegeben und str2 zugewiesen. Da str1 und str2 auf das „abc“-Objekt im selben String-Pool verweisen, ist das Ergebnis wahr.
String str3 = new String("abc"); String str4 = new String("abc"); // falseSystem.out.println(str3 == str4);
Wenn Sie das Schlüsselwort new zum Erstellen eines neuen String-Objekts verwenden, sucht die JVM zuerst nach dem String-Objekt „abc“ im String-Pool.
Wenn nicht, durchsucht sie zuerst das String-Objekt im String-Pool. Erstellen Sie ein „abc“-String-Objekt im Pool, erstellen Sie dann ein „abc“-String-Objekt im Heap und weisen Sie dann str3
<🎜 die Adresse des „abc“-String-Objekts im Heap zu > Wenn es eines gibt, erstellen Sie statt des „abc“-Objekts im Pool ein „abc“-String-Objekt direkt im Heap und weisen Sie dann str4 die Adresse des „abc“-Objekts im Heap zu. Auf diese Weise zeigt str4 auf das im Heap erstellte Zeichenfolgenobjekt „abc“ Da str3 und str4 auf unterschiedliche Zeichenfolgenobjekte verweisen, ist das Ergebnis falsch.HashCode zwischenspeichern
Wenn die String-Klasse erstellt wird, wird der Hashcode in der Hash-Mitgliedsvariablen zwischengespeichert, da die String-Klasse unveränderlich ist Der Hashcode ändert sich nicht. Auf diese Weise können Sie den Hashcode jedes Mal, wenn Sie ihn verwenden möchten, direkt und ohne Neuberechnung abrufen, was die Effizienz verbessertpublic final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** Cache the hash code for the string */ private int hash; // Default to 0 }
Kann als Schlüssel von HashMap verwendet werden
Aufgrund der Unveränderlichkeit der String-Klasse wird sie häufig als Schlüssel von HashMap verwendet. Wenn die String-Klasse variabel ist und sich der Inhalt ändert, ändert sich auch der HashCode Wenn die HashMap auf diesem Schlüssel basiert, wird der Wert möglicherweise nicht abgerufen oder es wird der falsche Wert erhaltenThread-Sicherheit
Unveränderliche Objekte sind von Natur aus Thread-sicher, wodurch Probleme in Multithread-Umgebungen vermieden werden können. Führen Sie als Nächstes Synchronisierungsvorgänge für String durch.Vielen Dank an alle fürs Lesen, ich hoffe, dass Sie viel davon profitieren werden.
Dieser Artikel ist reproduziert von: https://blog.csdn.net/zzti_erlie/article/details/106872673
Empfohlenes Tutorial: „Java-Tutorial“
Das obige ist der detaillierte Inhalt vonWarum ist die String-Klasse in Java unveränderlich (ausführliche Erklärung). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!