270 votes

Qu'est-ce que l'internat de Java String ?

¿Qué es? Internalisation des chaînes de caractères en Java, quand je devrais l'utiliser, et pourquoi ?

3voto

Robin Gupta Points 59

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 .

1voto

Srijani Points 57

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

1voto

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.

1voto

Saroj Points 73

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
}
}

organigramme des stagiaires

0voto

user1877246 Points 47

Selon les documents de Java, la JVM maintient un pool de chaînes uniques. Donc, si la JVM s'occupe de la mise en commun des chaînes, pourquoi devrions-nous utiliser intern() explicitement ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X