Java intern()-Methode

Java String类Java String-Klasse


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 class ExampleTest {
    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 desnewSchlüsselworts, wird esein neues String-Objekt im Heap erstellen, das heißt,str2 es 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.

  • Dastr1 bereits im Konstantenpooldarin,str3undstr1verweist auf dasselbe Objekt.

System.out.println(str1 == str2);

  • str1 verweist auf den Konstantenpool,str2 verweist 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

Java String类Java String-Klasse

Andere Erweiterungen