JavaSE - String-Konstanten-Pool (StringTable)

ced485cbb11e458d81a746890b32cf3f.gif

Autor: Rukawa Maple Knock Code

Blog-Homepage: Rukawa Kaedes Blog

Kolumne: Lerne Java mit mir

Zitat: Bleib hungrig, bleib dumm

Wenn Sie Gutes tun wollen, müssen Sie zuerst Ihre Werkzeuge schärfen Lassen Sie mich Ihnen ein superstarkes Werkzeug vorstellen, um Angebote von großen Herstellern zu gewinnen - Niuke.com

Klicken Sie hier, um sich kostenlos zu registrieren und die Fragen mit mir zu beantworten  

Artikelverzeichnis

1. String-Konstanten-Pool

2. Interne Methode

3. Interviewfragen


1. String-Konstanten-Pool (StringTable)

Um die Leistung zu verbessern, den Speicher-Overhead zu reduzieren und die wiederholte Erstellung von Strings zu vermeiden, verwaltet die JVM einen speziellen Speicherplatz, den String-Konstanten-Pool. Der String-Konstantenpool wird privat von der String-Klasse verwaltet

Um Speicherplatz und die Laufeffizienz des Programms zu sparen, führt Java außerdem Folgendes ein:

1. Klassendatei-Konstantenpool: Nachdem jede .Java-Quelldatei kompiliert wurde, speichert die .Class-Datei die Literalkonstanten und Symbolinformationen in der aktuellen Klasse

2. Laufzeitkonstantenpool: Wenn die .Class-Datei geladen wird, wird der Konstantenpool in der .Class-Datei in den Speicher geladen, der als Laufzeitkonstantenpool bezeichnet wird, und jede Klasse im Laufzeitkonstantenpool hat eine Kopie

Es gibt zwei Möglichkeiten, String-Objekte in Java zu erstellen:

1. Verwenden Sie direkt String-Konstanten für die Zuweisung

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1==s2);

    }
}
//运行结果:true

Verwenden Sie String s1 = "hello"; Beim Erstellen eines Objekts geht die JVM zuerst zum String-Pool, um herauszufinden, ob das Objekt "hello" existiert. Wenn es nicht existiert, erstellt sie das Objekt "hello" im String pool, und dann „hello" in den Pool legen. Die Referenzadresse des Objekts „hello" wird an die String-Konstante s1 zurückgegeben, sodass s1 auf das String-Objekt „hello" im Pool zeigt; falls vorhanden, no -Objekt erstellt, und die Adresse des Objekts "Hallo" im Pool wird direkt zurückgegeben und mit der Give-String-Konstante belegt

 String s2 = „hello“; Beim Erstellen eines Objekts geht die JVM zuerst zum String-Konstantenpool, um „hello“ zu finden, und verweist auf die Adresse von s2, also wie in der Abbildung unten gezeigt, auf die Wertarrays, auf die s1 und s2 verweisen sind das gleiche Array

2. Erstellen Sie ein String-Klassenobjekt über new

public class Test {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        String s3 = new String("hello");
        String s4 = new String("hello");
        System.out.println(s3==s4);
        //运行结果:false
    }
}

Wenn s3 und s4 ein Objekt erstellen, gehen Sie zuerst zum String-Konstanten-Pool, um herauszufinden, ob es „Hallo“ im String-Konstanten-Pool gibt, und erstellen Sie dann das Objekt, wenn es nicht im Pool ist, erstellen Sie direkt ein „Hallo“-String-Objekt im Heap, und geben Sie dann die Adresse zurück Weisen Sie s3 oder s4 eine Referenz zu, die auf das im Heap erstellte Zeichenfolgenobjekt zeigt; wenn es nicht gefunden wird, erstellen Sie zuerst ein „Hallo“-Zeichenfolgenobjekt im Zeichenfolgenkonstantenpool und erstellen Sie dann eine "Hallo" im Heap "String-Objekt", dann weisen Sie die Adresse wieder der Referenz zu und zeigen so auf das im Heap erstellte Objekt

Wenn das Schlüsselwort new ein Objekt erstellt, ist die neue Ausgabe ein neues Objekt, d. h. die Referenzen s3 und s4 zeigen auf zwei verschiedene Objekte, sodass die Anweisungsausgabe: false ist

Eine Frage:

//下面代码将输出什么内容:()

public class SystemUtil{
	public static boolean isAdmin(String userId){
		return userId.toLowerCase()=="admin";
	}
	public static void main(String[] args){
		System.out.println(isAdmin("Admin"));
	}
}

analysieren:

Zunächst einmal sind die beiden Seiten des ==-Zeichens Referenzdatentypen, dann ist der Vergleich "die Adressen sind unterschiedlich".

Dann wird "admin" in der isAdmin()-Methode im String-Konstantenpool gespeichert, userId.toLowerCase() ist neu und ein neues Objekt wird zurückgegeben

Also Ausgabe: false

2. Interne Methode

Die Rolle dieser Methode besteht darin, das erstellte String-Objekt manuell zum Konstantenpool hinzuzufügen

public class Test {
    public static void main(String[] args) {
        char[] chars = new char[]{'h','e','l','l','o'};
        String s1 = new String(chars);
        //s1.intern();
        String s2 = "hello";
        System.out.println(s1==s2);
    }
    //运行结果:false
}

Wenn String s1 = new String(chars);, kopieren Sie ein neues Array und weisen Sie es s1 zu, d. h. s1 zeigt auf ein neues Array

Wenn String s2 = "hello"; ist, sucht die JVM zuerst nach "hello" im Konstantenpool, und wenn sie nein findet, erstellt sie ein "hello" und speichert es im Konstantenpool und gibt die Adresse an s2 zurück

Also Ausgabe: false

s1.intern hinzufügen ();

public class Test {
    public static void main(String[] args) {
        char[] chars = new char[]{'h','e','l','l','o'};
        String s1 = new String(chars);
        s1.intern();
        String s2 = "hello";
        System.out.println(s1==s2);
    }
    //运行结果:true
}

s1.intern(); Fügen Sie das erstellte String-Objekt dem Konstantenpool hinzu, wenn String s2 = „hello“;, geht die JVM zuerst zum Konstantenpool, um „hello“ zu finden, und gibt dann die Adresse an s2 zurück

Also Ausgabe: wahr

3. Interviewfragen

Bitte erläutern Sie den Unterschied zwischen den beiden Arten der Objektinstanziierung in der String-Klasse (in JDK1.8)

Zeichenfolge str = "Hallo"

Es wird nur einen Heap-Speicherplatz öffnen, ihn im String-Konstantenpool speichern und dann teilt str das String-Objekt im Konstantenpool

Zeichenfolge str = neue Zeichenfolge ("Hallo")

Es werden zwei Heap-Speicherplätze geöffnet, der String "Hallo" wird im String-Konstanten-Pool gespeichert und dann wird dem neu erstellten String-Objekt mit dem String-Objekt im Konstanten-Pool ein Wert zugewiesen.

String str = new String(new char[]{'h', 'e', ​​'l', 'l', 'o'})

Erstellen Sie nun ein String-Objekt auf dem Heap und verwenden Sie dann copyof, um den Array-Bereich erneut zu öffnen und den Inhalt des Parameter-String-Arrays in das String-Objekt zu kopieren

„Das Teilen dieser Ausgabe ist hier, denken Sie daran, dem Blogger einen Drei-Link zu geben, Ihre Unterstützung ist die größte treibende Kraft für meine Kreation!

ced485cbb11e458d81a746890b32cf3f.gif

Guess you like

Origin blog.csdn.net/chenchenchencl/article/details/126359224