1. Erstens gehört String nicht zu den 8 grundlegenden Datentypen. String ist ein Objekt.
Da der Standardwert eines Objekts null ist, ist der Standardwert von String ebenfalls null; es handelt sich jedoch 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 ein leerer String und nicht null ist;
3. String str="kvill";
Der Unterschied zwischen String str=new String ("kvill");:
Hier werden wir nicht über den Heap oder den Stack sprechen, sondern lediglich das einfache Konzept des konstanten Pools vorstellen.
Der konstante Pool bezieht sich auf den Pool, der zur Kompilierungszeit ermittelt und im kompilierten Pool gespeichert wird. Einige Daten in der Klassendatei. Es umfasst Konstanten in Klassen, Methoden, Schnittstellen usw. sowie Zeichenfolgenkonstanten.
Schauen Sie sich Beispiel 1 an:
Kopieren Sie den Codecode wie folgt:
String s0="kvill";
String s1="kvill";
String s2="kv" + "ill";
System.out.println( s0==s1 );
System.out.println( s0==s2 );
Das Ergebnis ist:
WAHR
WAHR
Zunächst müssen wir wissen, dass Java dafür sorgt, dass es nur eine Kopie einer String-Konstante gibt.
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 String-Konstanten sind Bei mehreren String-Konstanten muss es sich selbst um eine String-Konstante handeln, daher wird s2 zur Kompilierungszeit auch in eine String-Konstante analysiert, sodass s2 auch einer von „kvill“ im Konstantenpool ist.
Also erhalten wir s0==s1==s2;
Mit new String() erstellte Zeichenfolgen sind keine Konstanten und können zur Kompilierungszeit nicht bestimmt werden. Daher werden mit new String() erstellte Zeichenfolgen nicht in den Konstantenpool eingefügt, sondern verfügen über einen eigenen Adressraum.
Schauen Sie sich Beispiel 2 an:
Kopieren Sie den Codecode wie folgt:
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 );
Das Ergebnis ist:
FALSCH
FALSCH
FALSCH
In Beispiel 2 ist s0 immer noch die Anwendung von „kvill“ im Konstantenpool. Da s1 zur Kompilierungszeit nicht bestimmt werden kann, handelt es sich um einen Verweis auf das neue Objekt „kvill“, das zur Laufzeit erstellt wurde ("ill"), es ist auch Es kann zur Kompilierungszeit nicht bestimmt werden, es handelt sich also auch um eine Anwendung eines neu erstellten Objekts "kvill". Wenn Sie dies verstehen, wissen Sie, warum dieses Ergebnis erzielt wird.
4. String.intern():
Lassen Sie mich noch einen Punkt hinzufügen: existiert in. Der Konstantenpool in der Klassendatei 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 im Konstantenpool eine Stringkonstante mit demselben Unicode vorhanden ist seine Referenz. Wenn nicht, fügen Sie einen Unicode-String gleich str in den Konstantenpool ein und geben Sie seine Referenz zurück, wenn Sie sich Beispiel 3 ansehen.
Kopieren Sie den Codecode wie folgt:
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(); // Weisen Sie s2 die Referenz von „kvill“ im Konstantenpool zu
System.out.println(s0==s1);
System.out.println( s0==s1.intern() );
System.out.println( s0==s2 );
Das Ergebnis ist:
FALSCH
**********
false //Obwohl s1.intern() ausgeführt wird, ist sein Rückgabewert nicht s1 zugewiesen
true //Gibt an, dass s1.intern() einen Verweis auf „kvill“ im Konstantenpool zurückgibt
WAHR
Lassen Sie mich abschließend noch ein weiteres Missverständnis ausräumen:
Jemand sagte: „Verwenden Sie die Methode String.intern(), um eine String-Klasse in einer globalen String-Tabelle zu speichern. Wenn sich in dieser Tabelle bereits ein Unicode-String mit demselben Wert befindet, gibt diese Methode den String zurück, der sich bereits in der Tabelle befindet. Adresse, Wenn es in der Tabelle keine Zeichenfolge mit demselben Wert gibt, registrieren Sie Ihre eigene Adresse in der Tabelle. „Wenn ich die globale String-Tabelle als konstanten Pool verstehe, lautet sein letzter Satz: „Wenn in Wenn es keine Zeichenfolge gibt Wenn derselbe Wert in der Tabelle angezeigt wird, ist es falsch, die eigene Adresse in der Tabelle einzutragen:
Schauen Sie sich Beispiel 4 an:
Kopieren Sie den Codecode wie folgt:
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() );
Das Ergebnis ist:
FALSCH
kvill kvill
WAHR
In dieser Klasse haben wir keine „kvill“-Konstante deklariert, daher gab es zu Beginn kein „kvill“ im Konstantenpool. Als wir s1.intern() aufriefen, wurde dem Konstantenpool eine neue „kvill“-Konstante hinzugefügt Es stellt sich heraus, dass „kvill“, das sich nicht im Konstantenpool befindet, noch vorhanden ist, was bedeutet, dass es nicht „seine eigene Adresse im Konstantenpool registriert“.
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 ist s2==s1.intern() wahr.
5. Über equal() und ==:
Für String dient dies lediglich dazu, zu vergleichen, ob die Unicode-Sequenzen zweier Zeichenfolgen gleichwertig sind, und true zurückzugeben, wenn sie gleich sind, und == dient dazu, zu vergleichen, ob die Adressen der beiden Zeichenfolgen gleich sind, dh ob es sich um Referenzen handelt zur gleichen Zeichenfolge.
6. Über String ist unveränderlich
Dazu gibt es viel zu sagen, solange Sie wissen, dass sich eine String-Instanz nach ihrer Generierung nicht ändert, zum Beispiel: String str="kv"+"ill"+" "+"ans";
Es gibt 4 String-Konstanten: „kv“ und „ill“ erzeugen „kvill“, das dann im Speicher gespeichert wird wird mit „kvill ans“ kombiniert, um „kvill ans“ zu generieren und die Adresse dieser Zeichenfolge str zuzuweisen, da die „Unveränderlichkeit“ von String viele temporäre Variablen generiert, weshalb die Verwendung von StringBuffer empfohlen wird, da StringBuffer vorhanden ist veränderbar.