Méthode intern() Java

Java String类Classe String de Java


La méthode intern() est utilisée pour ajouter une chaîne au pool de chaînes interne à l'exécution et renvoyer la référence depuis le pool de chaînes.

Lorsque la méthode intern() est appelée, si le pool de constantes de chaînes contient déjà cette chaîne, elle renvoie la référence depuis le pool ; si le pool ne contient pas cette chaîne, elle l'ajoute au pool et renvoie la référence à cette chaîne.

La méthode intern() suit les règles suivantes :Pour deux chaînes quelconques s et t, s.intern() == t.intern() est vrai si et seulement si s.equals(t) est vrai.

String s1 = new String("Hello");
String s2 = "Hello";
String s3 = s1.intern();

System.out.println(s1 == s2);  // false
System.out.println(s2 == s3);  // true

Syntaxe

public String intern()

Parameters

  • Aucune

Valeur de retour

La valeur de retour de la méthode intern() est la référence de la chaîne dans le pool de constantes de chaînes (String Pool).

Règles de valeur de retour :

  • Si le pool de constantes de chaînescontient déjàcette chaîne : renvoyer la référence de la chaîne existante dans le pool.
  • Si le pool de constantes de chaînesne contient pascette chaîne : stocker la référence de la chaîne actuelle dans le tas dans le pool de constantes (au lieu de créer un nouvel objet), et renvoyer cette référence.

Différences entre versions de Java :

  • Dans JDK 6 et les versions antérieures, le pool de constantes de chaînes est stocké dans la zone de méthodes (PermGen), dont la capacité est limitée ; une utilisation excessive de intern() peut entraîner une OutOfMemoryError.

  • Dans JDK 7 et versions ultérieures, le pool de constantes de chaînes a été déplacé vers la mémoire du tas, ce qui permet de stocker davantage de données.

Exemple

L'exemple suivant illustre l'application de la méthode intern() :

Exemple

public class ExampleTest {
    public static void main(String args[]) {
        // str1 affecte directement le littéral de chaîne "Example", qui est stocké dans le pool de constantes de chaînes (String Pool)
        String str1 = "Example";

        // str2 est créé à l'aide du mot-clé new, et il est stocké dans la mémoire du tas
        String str2 = new String("Example");

        // str3 est la référence obtenue après que str2 a appelé la méthode intern()
        // La méthode intern() place "Example" dans le pool de constantes de chaînes et renvoie la référence dans le pool
        String str3 = str2.intern();

        // Comparer str1 et str2
        // str1 pointe vers "Example" dans le pool de constantes, str2 pointe vers l'objet dans la mémoire du tas
        // Comme leurs adresses sont différentes, le résultat est false
        System.out.println(str1 == str2);  // false

        // Comparer str1 et str3
        // str3 est la référence retournée après que str2 appelle la méthode intern(), et elle pointe vers "Example" dans le pool de constantes
        // str1 pointe aussi vers "Example" dans le pool de constantes, donc leurs adresses sont identiques et le résultat est true
        System.out.println(str1 == str3);  // true
    }
}

Explication du code :

String str1 = "Example";

  • En affectant directement un littéral de chaîne "Example", il seraautomatiquement stocké dans le pool de constantes de chaînes(String Pool).

String str2 = new String("Example");

  • En raison de l'utilisation dunewmot-clé, il vacréer un nouvel objet chaîne dans le tas, c'est-à-dire,str2 il ne pointe pas vers le pool de constantes, mais pointe vers une nouvelle adresse mémoire.

String str3 = str2.intern();

  • intern()La méthode vérifie si la chaîne"Example"existe déjàdans le pool de constantes de chaînes:

    • S'il existe, renvoyer la référence de cette chaîne ;

    • S'il n'existe pas, l'ajouter au pool de constantes et renvoyer la référence dans le pool.

  • Puisquestr1 déjà dans le pool de constantesdans,str3etstr1pointe vers le même objet.

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

  • str1 pointe vers le pool de constantes,str2 pointe vers l'objet dans le tas, donc==la comparaison porte sur des adresses mémoire différentes, le résultatfalse。

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

  • str3Aprèsintern()cela,pointe vers la chaîne dans le pool de constantes, et avecstr1pointe vers le même objet, résultattrue。

La sortie du programme ci-dessus est :

false
true

Java String类Classe String de Java

Autres extensions