Java intern()-Methode
Die intern()-Methode wird verwendet, um zur Laufzeit eine Zeichenkette zum internen String-Pool hinzuzufügen und die Referenz aus dem String-Pool zurückzugeben.
Wenn die intern()-Methode aufgerufen wird, gibt sie, falls der String-Konstantenpool diese Zeichenkette bereits enthält, die Referenz aus dem Pool zurück; falls der Pool diese Zeichenkette nicht enthält, fügt sie diese dem Pool hinzu und gibt die Referenz auf diese Zeichenkette zurück.
Die intern()-Methode folgt den folgenden Regeln:Für zwei beliebige Zeichenketten s und t ist s.intern() == t.intern() genau dann wahr, wenn s.equals(t) wahr ist.
String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // true
Syntax
public String intern()
Parameters
Keine
Rückgabewert
Der Rückgabewert der intern()-Methode ist die Referenz der Zeichenkette im String-Konstantenpool (String Pool).
Regeln für den Rückgabewert:
- Wenn der String-Konstantenpooldiese Zeichenkette bereits enthält: Gib die Referenz der vorhandenen Zeichenkette im Pool zurück.
- Wenn der String-Konstantenpooldiese Zeichenkette nicht enthält: Speichere die Referenz der aktuellen Zeichenkette im Heap in den Konstantenpool (anstatt ein neues Objekt zu erstellen) und gib diese Referenz zurück.
Unterschiede zwischen Java-Versionen:
In JDK 6 und früher wird der String-Konstantenpool im Methodenbereich (PermGen) gespeichert, der eine begrenzte Kapazität hat; übermäßige Verwendung von intern() kann zu OutOfMemoryError führen.
In JDK 7 und höher wurde der String-Konstantenpool in den Heap-Speicher verschoben, wodurch mehr Daten gespeichert werden können.
Beispiel
Das folgende Beispiel demonstriert die Anwendung der intern()-Methode:
Beispiel
public static void main(String args[]) {
// str1 weist direkt das String-Literal "Example" zu, das im String-Konstantenpool (String Pool) gespeichert ist
String str1 = "Example";
// str2 wird mit dem Schlüsselwort new erstellt und im Heap-Speicher gespeichert
String str2 = new String("Example");
// str3 ist die Referenz, die nach dem Aufruf der intern()-Methode durch str2 erhalten wird
// Die intern()-Methode legt "Example" in den String-Konstantenpool und gibt die Referenz im Pool zurück
String str3 = str2.intern();
// Vergleiche str1 und str2
// str1 zeigt auf "Example" im Konstantenpool, str2 zeigt auf das Objekt im Heap-Speicher
// Da ihre Adressen unterschiedlich sind, ist das Ergebnis false
System.out.println(str1 == str2); // false
// Vergleiche str1 und str3
// str3 ist die Referenz, die zurückgegeben wird, nachdem str2 die Methode intern() aufgerufen hat, und sie zeigt auf "Example" im Konstantenpool
// str1 zeigt ebenfalls auf "Example" im Konstantenpool, daher sind ihre Adressen gleich und das Ergebnis ist true
System.out.println(str1 == str3); // true
}
}
Code-Erklärung:
String str1 = "Example";
-
Bei direkter Zuweisung eines String-Literals
"Example", wird esautomatisch im String-Konstantenpool gespeichert(String Pool).
String str2 = new String("Example");
-
Aufgrund der Verwendung des
newSchlüsselworts, wird esein neues String-Objekt im Heap erstellen, das heißt,str2es zeigt nicht auf den Konstantenpool, sondern zeigt auf eine neue Speicheradresse.
String str3 = str2.intern();
-
intern()Die Methode prüft, ob die Zeichenkette"Example"bereitsexistiert im String-Konstantenpool:Wenn er existiert, gib die Referenz dieses Strings zurück;
Wenn er nicht existiert, füge ihn dem Konstantenpool hinzu und gib die Referenz im Pool zurück.
-
Da
str1bereits im Konstantenpooldarin,str3undstr1verweist auf dasselbe Objekt.
System.out.println(str1 == str2);
-
str1verweist auf den Konstantenpool,str2verweist auf das Objekt im Heap, also==der Vergleich bezieht sich auf unterschiedliche Speicheradressen, das Ergebnisfalse。
System.out.println(str1 == str3);
-
str3Nachintern()dem,verweist auf den String im Konstantenpool, und mitstr1verweist auf dasselbe Objekt, Ergebnistrue。
Die Ausgabe des obigen Programms ist:
false true
Andere Erweiterungen
Java String-Klasse