Zunächst sollten wir klar sein, dass es in der Praktikum -Methode der String -Klasse in JDK1.6 und JDK1.7 immer noch einen Unterschied gibt:
Praktikant in JDK1.6:
Gehen Sie beim Aufrufen der Praktikanten -Methode zuerst zum konstanten Pool, um festzustellen, ob ein Wert wie der aktuelle Zeichenfolgenwert besteht. Wenn es vorhanden ist, gibt es direkt einen Verweis auf den String -Wert im konstanten Pool zurück. Wenn es nicht vorhanden ist, wird die Zeichenfolge aus dem ursprünglichen Heap in den konstanten Pool kopiert.
Praktikant in JDK1.7:
Gehen Sie beim Aufrufen der Praktikanten -Methode zuerst zum konstanten Pool, um festzustellen, ob ein Wert wie der aktuelle Zeichenfolgenwert besteht. Wenn es vorhanden ist, gibt es direkt einen Verweis auf den String -Wert im konstanten Pool zurück. Wenn es nicht vorhanden ist, wird der Verweis auf den ursprünglichen Haufen im konstanten Pool nur gelegt und die gesamte Zeichenfolge nicht in den konstanten Pool kopiert.
Dies bedeutet, dass JDK1.6 und JDK1.7 unterschiedlich behandeln, wenn diese Zeichenfolge im konstanten Pool nicht existiert.
Das Folgende ist ein Beispiel zum Überprüfen und Erklären:
Beispiel:
public static void main (String [] args) {String str = "str"+new String ("01"); ① Str.intern (); ② String str1 = "str01"; String str2 = new String ("str01"); ④ str2.intern (); ⑤ String str3 = "str01"; ⑥ System.out.println (str2 == str3); String str4 = "str01"; ⑦ String str5 = new String ("str")+new String ("01"); ⑧ str5.intern (); ⑨ System.out.println (str4 == str5); In JDK1.6 ist das Ausgabeergebnis::
FALSCH
FALSCH
FALSCH
erklären:
① Während der Ausführung wird ein String -Objekt STR mit dem Wert "Str01" im Heap -Speicher erstellt, und eine "Str" und "01" -Konstanten werden im konstanten Pool erstellt.
② Gehen Sie beim Ausführen zuerst in den konstanten Pool, um zu überprüfen, ob es einen konstanten Wert von "str01" gibt, und stellen Sie fest, dass es nicht existiert. Die Methode von JDK1.6 besteht darin, eine Kopie der Zeichenfolge "Str01" im konstanten Pool zu generieren.
③ Während der Ausführung wird ein "Str01" -Objekt im konstanten Pool erstellt, und es wird festgestellt, dass es bereits existiert, sodass es nicht neu erstellt wird.
Der Grund für die erste Ausgabe falsch ist, dass STR auf "str01" im Heap -Speicher verweist, während Str1 auf "STR01" im konstanten Pool verweist.
④ Beim Ausführen wird ein String -Objekt Str2 mit einem Wert von "str01" im Heap -Speicher erstellt, und eine Konstante mit einem Wert von "str01" wird im konstanten Pool erstellt.
⑤ Gehen Sie beim Ausführen zuerst in den konstanten Pool, um zu überprüfen, ob ein konstanter Wert von "str01" besteht. Wenn festgestellt wird, dass es existiert, wird diese ständige Referenz direkt zurückgegeben.
⑥ Während der Ausführung wird im konstanten Pool ein konstanter Wert von "str01" erstellt. Wenn festgestellt wird, dass es bereits existiert, wird es nicht erstellt.
Der Grund für die zweite Ausgabe falsch ist, dass Str2 auf "str01" im Heap -Speicher zeigt, während Str3 auf "str01" im konstanten Pool verweist.
⑦ Während der Ausführung wird im konstanten Pool ein konstanter Wert von "str01" erstellt.
⑧Wenn ein String -Objekt Str5 mit dem Wert "Str01" im Heap -Speicher erstellt wird, und im konstanten Pool werden eine "Str" und "01" -Konstanten erstellt.
⑨ Beim Ausführen wird der konstante Pool verwendet, um zu prüfen, ob ein konstanter Wert von "str01" besteht. Wenn es gefunden wird, gibt es diese konstante Referenz direkt zurück.
Der Grund für die dritte Ausgabe False ist, dass Str5 auf "str01" im Heap -Speicher verweist, während Str4 auf "str01" im konstanten Pool verweist.
In JDK1.7 ist das Ausgabeergebnis::
WAHR
FALSCH
FALSCH
erklären:
Ich fand, dass nur das erste Ausgabeergebnis unterschiedlich ist. Daher erklären wir nur den Grund für den ersten:
① Während der Ausführung wird ein String -Objekt -STR mit dem Wert "Str01" im Heap -Speicher erstellt, und eine "Str" und "01" -Konstante werden im konstanten Pool erstellt. (Dies unterscheidet sich nicht von JDK1.6)
② Gehen Sie beim Ausführen zuerst in den konstanten Pool, um zu überprüfen, ob es einen konstanten Wert von "str01" gibt, und stellen Sie fest, dass es nicht existiert. Die Methode von JDK1.7 besteht darin, die Referenz von "Str01" im Heap -Speicher auf den konstanten Pool zu kopieren.
③ Während der Ausführung wird ein "Str01" -Objekt im konstanten Pool erstellt, und es wird festgestellt, dass es bereits existiert, sodass es nicht neu erstellt wird.
Zu diesem Zeitpunkt verweisen STR und STR1 beide auf den Wert von "str01" im Heap -Speicher, sodass die beiden gleich sind;
Das obige ist ein Vergleich der Praktikanten der String -Klasse in JDK1.6 und JDK1.7. Es gibt Unterschiede. Freunde, die es brauchen, können sich darauf beziehen.