Heim >Java >javaLernprogramm >Umfassende Analyse des String-Objektdatentyps in Java
1. Erstens gehört String nicht zu den 8 Grunddatentypen.
Da der Standardwert des Objekts null ist, ist der Standardwert von String ebenfalls null, aber es ist 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.
String str=new String ("kvill"); Der Unterschied:
Hier sprechen wir nicht über den Heap oder den Stack, sondern stellen nur kurz das einfache Konzept des konstanten Pools vor.
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.
Sehen Sie sich Beispiel 1 an:
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
Zuerst müssen wir wissen, dass das Ergebnis das ist, was Java tun wird Stellen Sie sicher, dass es nur eine Kopie der Zeichenfolgenkonstante 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“ sind auch Zeichen-String-Konstanten, wenn Eine Zeichenfolge besteht aus mehreren Zeichenfolgenkonstanten und muss selbst eine Zeichenfolgenkonstante sein. Daher wird s2 zur Kompilierungszeit auch in eine Zeichenfolgenkonstante analysiert, sodass s2 auch ein „kvill“ im Konstantenpool ist.
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:
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:
false
false
false
In Beispiel 2 ist s0 immer noch die Anwendung von „kvill“. Der Konstantenpool und s1 liegen daran, dass er zur Kompilierungszeit nicht bestimmt werden kann, also ein Verweis auf das neue Objekt „kvill“ ist, das zur Laufzeit erstellt wird. Da s2 die zweite Hälfte von newString („ill“) hat, kann es nicht bestimmt werden Zur Kompilierungszeit handelt es sich also um ein neu erstelltes Objekt „kvill“. Wenn Sie diese verstehen, wissen Sie, warum dieses Ergebnis erhalten 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 sich im Konstantenpool eine Stringkonstante mit demselben Unicode befindet seine Referenz. Wenn nicht, fügen Sie eine Unicode-Zeichenfolge gleich str im Konstantenpool hinzu und geben Sie ihre Referenz zurück, indem Sie sich Beispiel 3 ansehen
Beispiel 3:
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 );
Das Ergebnis ist :
false
**********
false //Obwohl s1.intern() ausgeführt wird, wird sein Rückgabewert s1 nicht zugewiesen
true //Gibt an, dass s1 .intern() gibt zurück Es handelt sich um einen Verweis auf „kvill“ im Konstantenpool
true
Abschließend möchte ich ein weiteres Missverständnis ausräumen:
Jemand sagte: „Verwenden Sie die Methode String.intern(), um a zu speichern String-Klasse zu einer globalen String-Tabelle: Wenn der Unicode-String mit demselben Wert bereits in dieser Tabelle vorhanden ist, gibt diese Methode die Adresse des Strings zurück, der bereits in der Tabelle vorhanden ist In der Tabelle registrieren Sie Ihre eigene Adresse Tabelle“ ist falsch. :
Siehe Beispiel 4:
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() );
结果为:
false
kvill kvill
true
在这个类中我们没有声名一个"kvill"常量,所以常量池中一开始是没有"kvill"的,当我们调用s1.intern()后就在常量池中新添加了一个"kvill"常量,原来的不在常量池中的"kvill"仍然存在,也就不是"将自己的地址注册到常量池中"了。
s1==s1.intern()为false说明原来的"kvill"仍然存在;
s2现在为常量池中"kvill"的地址,所以有s2==s1.intern()为true.
5. 关于equals()和==:
这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。
6. 关于String是不可变的
这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:String str="kv"+"ill"+" "+"ans";
就是有4个字符串常量,首先"kv"和"ill"生成了"kvill"存在内存中,然后"kvill"又和" " 生成 "kvill "存在内存中,最后又和生成了"kvill ans";并把这个字符串的地址赋给了str,就是因为String的"不可变"产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。
更多Java中的String对象数据类型全面解析相关文章请关注PHP中文网!