¿Qué es? Internalisation des chaînes de caractères en Java, quand je devrais l'utiliser, et pourquoi ?
Réponses
Trop de publicités?L'internage des chaînes de caractères est une technique d'optimisation du compilateur. Si vous avez deux chaînes littérales identiques dans une unité de compilation, le code généré garantit qu'il n'y a qu'un seul objet chaîne créé pour toutes les instances de cette chaîne littérale (caractères entre guillemets) dans l'assemblage.
Je suis issu du milieu C#, je peux donc vous expliquer en vous donnant un exemple :
object obj = "Int32";
string str1 = "Int32";
string str2 = typeof(int).Name;
le résultat des comparaisons suivantes :
Console.WriteLine(obj == str1); // true
Console.WriteLine(str1 == str2); // true
Console.WriteLine(obj == str2); // false !?
Note1 :Les objets sont comparés par référence.
Note2 :typeof(int).Name est évalué par la méthode de réflexion et n'est donc pas évalué au moment de la compilation. Ici, ces comparaisons sont effectuées au moment de la compilation.
Analyse des résultats : 1) vrai parce que les deux contiennent le même littéral et donc le code généré n'aura qu'un seul objet référençant "Int32". Voir note 1 .
2) vrai car le contenu des deux valeurs est vérifié et est identique.
3) FAUX car str2 et obj n'ont pas le même littéral. Voir Note 2 .
L'internage consiste à utiliser la méthode intern() sur une chaîne de caractères. Cela permet de stocker une chaîne dans le pool de constantes String. Pour plus d'information à ce sujet, veuillez visiter ce lien -
http://javacodingtutorial.blogspot.com/2013/12/comparing-string-objects-intern-other.html
Java interning() method basically makes sure that if String object is present in SCP, If yes then it returns that object and if not then creates that objects in SCP and return its references
for eg: String s1=new String("abc");
String s2="abc";
String s3="abc";
s1==s2// false, because 1 object of s1 is stored in heap and other in scp(but this objects doesn't have explicit reference) and s2 in scp
s2==s3// true
now if we do intern on s1
s1=s1.intern()
//JVM checks if there is any string in the pool with value “abc” is present? Since there is a string object in the pool with value “abc”, its reference is returned.
Notice that we are calling s1 = s1.intern(), so the s1 is now referring to the string pool object having value “abc”.
At this point, all the three string objects are referring to the same object in the string pool. Hence s1==s2 is returning true now.
En utilisant la référence d'objet de tas, si nous voulons correspondre à la référence d'objet SCP, nous devons utiliser la méthode intern().
Exemple :
class InternDemo
{
public static void main(String[] args)
{
String s1=new String("smith");
String s2=s1.intern();
String s3="smith";
System.out.println(s2==s3);//true
}
}