Der konstante Pool von Java ist normalerweise in zwei Arten unterteilt: statischer konstanter Pool und Laufzeitkonstante Pool
Statischer konstanter Pool: Ein konstanter Pool in der Klassendatei. Der konstante Pool in der Klassendatei enthält String (Nummer) Literalwerte, Klassen- und Methodeninformationen, die den größten Teil des Speicherplatzes in der Klassendatei einnehmen.
Laufzeit konstanter Pool: Nachdem das JVM das Laden der Klasse abgeschlossen hat, lädt er den konstanten Pool in der Klassendatei in den Speicher und speichert sie im Methodenbereich. Was wir normalerweise sprechen, ist der ständige Pool des konstanten Laufzeit -Pools im Methodenbereich. Ein weiteres wichtiges Merkmal seines konstanten Pools im Vergleich zur Klassendatei ist die Dynamizität. Die Java -Sprache verlangt nicht, dass Konstanten nur während der Kompilierungsperiode generiert werden, dh der Inhalt des konstanten Pools in der Klassendatei kann den konstanten Pool der Methodenbereichen für den Laufzeitbereich eingeben. Während des Laufs können auch neue Konstanten in den Pool gestellt werden. Diese Funktion wird häufiger von Entwicklern verwendet. Die praktische () Methode der String -Klasse.
Programmzähler: Ist eine Pipeline für die Programmausführung, die angibt, welchen Befehl als nächstes ausführen soll.
Lokaler Methodenstack: Der von JVM verwendete Stack, um Betriebssystemmethoden aufzurufen.
Virtual Machine Stack: Der von JVM verwendete Stapel zum Ausführen von Java -Code
Virtual Machine Heap: Wo Objekte gespeichert werden und alle Objekte, die in Java -Programmen neu sind, im Haufen gespeichert werden.
Methodenbereich: Storekonstanten, Klasseninformationen und statische Variablen, die als Ort verstanden werden können, an dem die Klassendatei im Speicher gespeichert ist.
Vorteile des ständigen Poolings:
Konstante Pools werden verwendet, um häufige Erzeugung und Zerstörung von Objekten zu vermeiden, die die Systemleistung beeinflussen, und sie erkennen die gemeinsame Nutzung von Objekten.
Beispielsweise wird ein String Constant Pool verwendet, um alle String -Literale während der Zusammenstellungsphase in einen konstanten Pool zu bringen.
1. Speichern Speicherplatz: Alle Stringkonstanten mit dem gleichen wörtlichen Wert im konstanten Pool werden verschmolzen und nur einen Raum einnehmen
2. Laufzeit speichern: Bei der Durchführung von String -Vergleiche ist == schneller als gleich (). Verwenden Sie bei zwei Referenzvariablen nur ==, um festzustellen, ob die Referenzen gleich sind, damit Sie feststellen können, ob die tatsächlichen Werte gleich sind.
== Die Bedeutungen grundlegender Datentypen und Objektdarstellungen sind unterschiedlich.
Für den grundlegenden Datentyp: == Vergleich ist der Wert des grundlegenden Datentyps für Objekt: == Vergleich ist die Speicheradresse des Objekts im Speicher
8 grundlegende Datentypen Wickelklassen und konstante Pools
Die meisten Wrapper -Klassen grundlegender Datentypen in Java implementieren konstante Pooling -Technologien, nämlich Byte, Kurz, ganzzahl, lang, charakteristisch und boolean.
Ganzzahl i1 = 40; Ganzzahl i2 = 40; System.out.println (i1 == i2); // true
Byte, kurz, ganzzahl, lang, Zeichen, diese fünf Wrapper-Klassen erstellen standardmäßig Cache-Daten des entsprechenden Typs von [-128, 127] und speichern sie im konstanten Pool. Wenn es diesen Bereich überschreitet, wird weiterhin ein neues Objekt erstellt.
public static Integer ValueOf (int i) {Assert IntegerCache.High> = 127; if (i> = integercache.low && i <= integercache.high) return IntegerCache.cache [i + (-intergercache.low)]; Neue Ganzzahl zurückgeben (i); }Ganzzahl i1 = 400; Ganzzahl i2 = 400; System.out.println (i1 == i2); // false
2. Die beiden Arten von Schwimmpunkt-Nummernverpackungsklassen schweben und doppelt keine konstanten Pooling-Technologie implementieren.
Doppel D1 = 2,5; Doppel D2 = 2,5; System.out.println (D1 == D2); // false
3. Szenarien zum Auftragen konstanter Pools
(1) .Integeri1 = 40; Da Integer eine Wrapper -Klasse des grundlegenden Datentyps int ist und ein Objekt ist, führt Java beim Kompilieren automatische Boxvorgänge durch und umfasst den Code direkt in Integeri1 = Integer.Valueof (40), wodurch Objekte im konstanten Pool verwendet werden
(2) .Integeri1 = newInteger (40); In diesem Fall wird ein neues Objekt erstellt
Ganzzahl i1 = 40; Integer i2 = New Integer (40); System.out.println (i1 == i2); // false
In diesem Fall wird New Integer keine automatische Boxreferenz vorhandenen Konstanten im konstanten Pool durchführen, sondern direkt ein neues Objekt im Haufen erstellen.
4. Ganzzahl Details
Ganzzahl i1 = 40; Ganzzahl i2 = 40; Ganzzahl i3 = 0; Ganzzahl i4 = Neue Ganzzahl (40); Ganzzahl i5 = Neue Ganzzahl (40); Ganzzahl i6 = Neue Ganzzahl (0); Ganzzahl i7 = 128; Ganzzahl i8 = 128; System.out.println ("i1 = i2" + (i1 == i2)); System.out.println ("i1 = i2 + i3" + (i1 == i2 + i3)); System.out.println ("i1 = i4" + (i1 == i4)); System.out.println ("i4 = i5" + (i4 == i5)); System.out.println ("i4 = i5 + i6" + (i4 == i5 + i6)); System.out.println ("40 = i5 + i6" + (40 == i5 + i6)); System.out.println ("i7 = i8" + (i7 == i8));i1 = i2 trui1 = i2+i3 trui1 = i4 falsei4 = i5 falsei4 = i5+i6 true40 = i5+i6 trui7 = i8 false
Erläuterung: Die Aussage i4 == i5 + i6, weil der + Operator nicht für ganzzahlige Objekte anwendbar ist. Erstens führen i5 und i6 automatische Unboxing -Vorgänge aus und fügen Sie Werte hinzu, dh i4 == 40. Dann kann das Ganzzahl -Objekt nicht direkt mit dem numerischen Wert verglichen werden, sodass i4 es automatisch nicht mehr enttäuscht und in den int -Wert 40 umgewandelt wird. Schließlich wird diese Anweisung für den numerischen Vergleich in 40 == 40 konvertiert.
Stringklasse und konstantes Pool
1.Wie zum Erstellen von String -Objekten erstellen
String s1 = "abdcd"; String s2 = new String ("ABCD"); System.out.println (S1 == S2); // falseEs gibt Unterschiede in den Erstellungsmethoden dieser beiden verschiedenen Arten. Die erste besteht darin, Objekte im konstanten Pool zu nehmen, und das zweite besteht darin, neue Objekte im Heap -Speicherraum zu erstellen.
Verwenden Sie einfach neue Objekte, die im Haufen erstellt werden.
2.Konnection Expression+
(1). Nur neue Objekte, die durch "+" -Kinneken zwischen String -Objekten erstellt wurden, die mit "Text enthalten" erstellt wurden, werden dem String Constant Pool hinzugefügt.
(2). Für andere Formen wie zwei Objektreferenzen, die direkt durch "+" oder Objekte verbunden sind, oder über den neuen Modus erstellt werden, werden die resultierenden neuen Objekte nicht zum Konstantenpool von String hinzugefügt.
String str1 = "str"; String str2 = "ing"; String str3 = "str" + "ing"; String str4 = str1 + str2; system.out.println (str3 == str4); // false String str5 = "String"; System.out.println (str3 == str5); // True
öffentliche statische endgültige Zeichenfolge a = "ab"; // Konstante apublische statische endgültige Zeichenfolge b = "CD"; // Konstante bpublische statische void main (String [] args) {String S = a + b; // Initialisieren S mit + Verkettungsstring t = "ABCD"; if (s == t) {System.out.println ("s gleich t, sie sind dasselbe Objekt"); } else {system.out.println ("S ist nicht gleich t, sie sind nicht dasselbe Objekt"); }} s gleich t sind das gleiche ObjektA und B sind beide Konstanten, und die Werte sind festgelegt, sodass der Wert von S ebenfalls festgelegt ist, was bestimmt wird, wenn die Klasse zusammengestellt wird. Mit anderen Worten: String S = A+B; Äquivalent zu: String S = "AB"+"CD";
öffentliche statische endgültige Zeichenfolge A; // Konstante apublische statische endgültige Zeichenfolge B; // Konstante bstatische {a = "ab"; B = "CD"; } public static void main (String [] args) {// initialisieren s mit + Verkettungszeichenfolge S = A + B; String t = "ABCD"; if (s == t) {System.out.println ("s gleich t, sie sind dasselbe Objekt"); } else {system.out.println ("S ist nicht gleich t, sie sind nicht dasselbe Objekt"); }} s ist nicht gleich T, sie sind nicht dasselbe ObjektObwohl A und B als Konstanten definiert sind, wird keiner von ihnen sofort zugeordnet. Vor der Berechnung des Werts von S, wenn sie zugewiesen werden und welchen Wert sie zugewiesen werden, sind Variablen. Daher ähneln ihre Eigenschaften, bevor A und B zugewiesen sind, einer Variablen. Dann können S während der Zusammenstellungsperiode nicht bestimmt werden, können jedoch nur zur Laufzeit erstellt werden.
3. STRINGS1 = NewString ("xyz"); Wie viele Objekte wurden erstellt?
Betrachten Sie die Klassenbelastungsphase und die tatsächliche Ausführung.
(1) Die Klassenbelastung wird nur einmal in einer Klasse durchgeführt. "xyz" wird erstellt und liegt, wenn die Klasse geladen ist (wenn die Zeichenfolge "xyz" vor dem Laden der Klasse gewohnt ist, müssen nicht die "xyz" -sinstanz für das Residenten wiederholt erstellt werden). Die angewandte Zeichenfolge wird in einem global geteilten String Constant Pool platziert.
(2) Wenn dieser Code anschließend ausgeführt wird, wird die String -Instanz, die dem "xyz" -Luchanschluss entspricht, festgelegt und wird nicht wiederholt erstellt. Dieser Code kopiert also eine Kopie des Objekts im konstanten Pool und stellt ihn in den Haufen und gibt den Verweis auf das Objekt im Haufen zu S1, um zu halten.
Diese Anweisung erstellt 2 Objekte.
4.Java.lang.String.intern ())
Ein weiteres wichtiges Merkmal des konstanten Laufzeitpools im Vergleich zum konstanten Pool der Klassendatei ist die Dynamik. Die Java -Sprache verlangt nicht, dass Konstanten nur während der Kompilierungsperiode generiert werden, dh der Inhalt des konstanten Pools in der Klassendatei kann den Methodenbereich eingeben. Während der Laufzeit können auch neue Konstanten in den Pool gegeben werden. Diese Funktion wird häufiger von Entwicklern verwendet. Die praktische () Methode der String -Klasse.
Die praktische () -Methode der String findet heraus, ob im konstanten Pool eine gleiche Zeichenfolge gleich sind. Wenn es vorhanden ist, gibt es einen Verweis auf die Zeichenfolge zurück. Wenn es nein gibt, fügt es dem konstanten Pool eine eigene Zeichenfolge hinzu.
public static void main (String [] args) {String s1 = new String ("Computer"); String S2 = S1.Intern (); String S3 = "Computer"; System.out.println ("S1 == S2?" + (S1 == S2)); System.out.println ("S3 == S2?" + (S3 == S2));}S1 == S2? fAlses3 == S2? WAHR
Zusammenfassen
Bei dem oben genannten dreht sich alles darum, Java konstante Pools ausführlich zu erforschen. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen.