Heim > Java > javaLernprogramm > Detaillierte Erklärung von intern() im String-Objekt

Detaillierte Erklärung von intern() im String-Objekt

Y2J
Freigeben: 2017-05-19 09:45:26
Original
1662 Leute haben es durchsucht

1. Erstens gehört String nicht zu den 8 Grunddatentypen.
Da der Standardwert eines Objekts null ist, ist der Standardwert von String ebenfalls null, aber es handelt sich um ein spezielles Objekt und weist einige Eigenschaften auf, die andere Objekte nicht haben.

2. new String() und new String("") deklarieren beide einen neuen leeren String, der kein Null ist.

3. Der Unterschied zwischen
String str=new String („kvill“);:

Hier reden wir nicht über den Heap oder den Stack, wir führen einfach die Konstante ein Pool-First-Konzept.

Der Konstantenpool bezieht sich auf einige Daten, die während der Kompilierung ermittelt und in der kompilierten .class-Datei gespeichert werden. Es umfasst Konstanten in Klassen, Methoden, Schnittstellen usw. sowie String-Konstanten.

Sehen Sie sich Beispiel 1 an:

String s0=”kvill”; 
String s1=”kvill”; 
String s2=”kv” + “ill”; 
System.out.
print
ln( s0==s1 ); 
System.out.println( s0==s2 );
Nach dem Login kopieren

Das Ergebnis ist:

true 
true
Nach dem Login kopieren

Zuerst müssen wir wissen, dass Java dies tut Stellen Sie sicher, dass eine String-Konstante nur eine Kopie hat.

Da „kvill“ in s0 und s1 im Beispiel beide String-Konstanten sind, werden sie zur Kompilierungszeit bestimmt, sodass s0==s1 wahr ist und „kv“ und „ill“ ebenfalls wahr sind alle String-Konstanten. Wenn ein String durch mehrere String-Konstanten verkettet ist, muss er selbst eine String-Konstante sein, daher wird s2 zur Kompilierungszeit auch in eine String-Konstante analysiert, sodass s2 auch ein Konstantenpool ist > von „kvill“. Daher kommen wir zu dem Schluss, dass s0==s1==s2; Die mit new String() erstellte Zeichenfolge keine Konstante ist und zur Kompilierungszeit nicht bestimmt werden kann, sodass die mit new String() erstellte Zeichenfolge keine enthält Konstanten Im Pool verfügen sie über einen eigenen Adressraum.

Sehen Sie sich Beispiel 2 an:



Das Ergebnis ist:
String s0=”kvill”; 
String s1=new String(”kvill”); 
String s2=”kv” + new String(“ill”); 
System.out.println( s0==s1 ); 
System.out.println( s0==s2 ); 
System.out.println( s1==s2 );
Nach dem Login kopieren


In Beispiel 2 ist s0 immer noch drin Der Konstantenpool „kvill“ „Anwendung, s1 kann zur Kompilierungszeit nicht bestimmt werden, daher ist es ein Verweis auf das neue Objekt „kvill“, das zur Laufzeit erstellt wird, und s2 kann zur Kompilierungszeit nicht bestimmt werden, da es die zweite Hälfte des neuen Strings enthält („ill“), es handelt sich also auch um eine neue
false 
false 
false
Nach dem Login kopieren
Objekt erstellen

Anwendung von „kvill“. Wenn Sie dies verstehen, wissen Sie, warum dieses Ergebnis erzielt wird. 4. String.intern():

Noch ein Punkt: Der in der .class-Datei vorhandene Konstantenpool wird zur Laufzeit von der JVM geladen und kann erweitert werden. Die intern()-Methode von String ist eine Methode zum Erweitern des Konstantenpools. Wenn eine String-Instanz str die intern()-Methode aufruft, prüft Java, ob sich im Konstantenpool eine Stringkonstante mit demselben Unicode befindet, und gibt sie gegebenenfalls zurück seine Referenz. Wenn nicht, fügen Sie eine Unicode-Zeichenfolge gleich str in den Konstantenpool ein und geben Sie ihre Referenz zurück; es wird deutlich, wenn Sie sich Beispiel 3 ansehen

Beispiel 3:


Das Ergebnis ist:
String s0= “kvill”; 
String s1=new String(”kvill”); 
String s2=new String(“kvill”); 
System.out.println( s0==s1 ); 
System.out.println( “**********” ); 
s1.intern(); 
s2=s2.intern(); //把常量池中“kvill”的引用赋给s2 
System.out.println( s0==s1); 
System.out.println( s0==s1.intern() ); 
System.out.println( s0==s2 );
Nach dem Login kopieren


Abschließend möchte ich ein weiteres Missverständnis ausräumen:
false 
********** 
false //虽然执行了s1.intern(),但它的返回值没有赋给s1 
true //说明s1.intern()返回的是常量池中”kvill”的引用 
true
Nach dem Login kopieren

Jemand sagte: „Verwenden Sie die Methode String.intern(), um eine String-Klasse zu speichern.“ zu einem globalen Wenn in der String-Tabelle die Unicode-Zeichenfolge mit demselben Wert bereits in dieser Tabelle vorhanden ist, gibt diese Methode die Adresse der Zeichenfolge zurück, die bereits in der Tabelle vorhanden ist. Wenn in der Tabelle keine Zeichenfolge mit demselben Wert vorhanden ist , Registrieren Sie Ihre eigene Adresse in der Tabelle. „Wenn ich die globale String-Tabelle als konstanten Pool verstehe, lautet sein letzter Satz: „Wenn die Tabelle keinen String mit demselben Wert enthält, registrieren Sie Ihre eigene Adresse in der Tabelle.“ ist falsch. :

Sehen Sie sich Beispiel 4 an:


Ergebnis:
String s1=new String("kvill"); 
String s2=s1.intern(); 
System.out.println( s1==s1.intern() ); 
System.out.println( s1+" "+s2 ); 
System.out.println( s2==s1.intern() );
Nach dem Login kopieren


In dieser Klasse haben wir kein „ kvill“-Konstante, daher gibt es am Anfang kein „kvill“ im Konstantenpool. Wenn wir s1.intern() aufrufen, wird dem Konstantenpool eine neue „kvill“-Konstante hinzugefügt. Das ursprüngliche „kvill“, das nicht vorhanden ist Der Konstantenpool existiert noch und es heißt nicht „Registrieren Sie Ihre eigene Adresse im Konstantenpool“.
false 
kvill kvill 
true
Nach dem Login kopieren

s1==s1.intern() ist falsch, was darauf hinweist, dass das ursprüngliche „kvill“ noch existiert;

s2 ist jetzt die Adresse von „kvill“ im Konstantenpool, also s2= =s1. intern() ist wahr.

5. Über equal() und ==:

Für String wird einfach verglichen, ob die Unicode-Sequenzen zweier Strings gleich sind. Wenn sie gleich sind, wird true zurückgegeben vergleicht zwei Strings, ob die Adressen der Strings gleich sind, das heißt, ob es sich um Verweise auf denselben String handelt.

6. Es gibt viel darüber zu sagen, dass String unveränderlich ist

Solange Sie wissen, dass sich eine String-Instanz nach ihrer Generierung nicht ändert, zum Beispiel: String str=" kv" +“ill“+“ „+“ans“; „kvill“ und speichern Sie es im Speicher und generieren Sie schließlich „kvill ans“ und weisen Sie die Adresse dieser Zeichenfolge str zu, da die „Unveränderlichkeit“ von String viele temporäre
Variablen
generiert Es wird empfohlen, StringBuffer zu verwenden, da StringBuffer veränderbar ist
[Verwandte Empfehlungen]

1. Kostenloses Java-Video-Tutorial

2. Eingehende Analyse der intern()-Methode in Java

3. JAVA Zusammenfassung der Erfahrungen mit der intern()-Methode

4. Was ist das Konzept der intern-Methode in Java

5 Analyse des Praktikanten in Java Die Funktion von ()

Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung von intern() im String-Objekt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage