Méthode intern() 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 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 du
newmot-clé, il vacréer un nouvel objet chaîne dans le tas, c'est-à-dire,str2il 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.
-
Puisque
str1déjà dans le pool de constantesdans,str3etstr1pointe vers le même objet.
System.out.println(str1 == str2);
-
str1pointe vers le pool de constantes,str2pointe 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
Autres extensions
Classe String de Java