7
votes

Concept de la méthode de stagiaire Confusion comme sortie modifiée avec une version différente

avec java version 1.6 La sortie est false true , mais avec la version 1.8 La sortie a été modifiée en vrai vrai .

Peut-on expliquer pourquoi cela se produit?

La méthode interne est utilisée pour renvoyer le pool de chaîne correspondant d'objets créés dans le tas, et si l'objet n'est pas là, il créera un pool constant à chaîne. S'il vous plaît corrigez-moi si ma compréhension est fausse. xxx


0 commentaires

3 Réponses :


1
votes

Je dirais que cela se produit à Java6 parce que le pool de string a été mis en œuvre utilisé le Permgen ... plus tard, à Java7, le string.Intern () commence à utiliser la mémoire de tas ...

Voir cette lien pour plus de détails. ..


2 commentaires

Rien que vous décrivez ici changerait la production du programme dans la question.


@ user2357112: Java 8: La première chaîne est arrivée dans le pool de cordes et le stagiaire a rendu cette même entrée de piscine à cordes. Donc, Carlitos est correct, le stagiaire n'est plus si spécial, superflu en fait.



0
votes

Les JLS spécifient ce qui devient une partie du pool constant. Littéraux strings et trucs récupérés par string.Intern ().

Il n'y a pas de spécification réelle quand elle en va partie (première utilisation ou charge de la classe définissant le littéral). Il n'impose pas non plus ce qui ne fait pas partie de cela, et quelles autres choses pourraient être internées.

Donc basé sur votre expérience, je suppose qu'ils ont changé la partie lorsque des cordes font partie du pool constant. Essentiellement changé de chargement de la classe à une première utilisation. So String.Intern () peut retourner "Ceci" tout en ajoutant que ceci à la piscine constante devenant le même exemple avec le littéral comme il est utilisé pour la première fois.


0 commentaires

2
votes

string.Intern () code> retourne l'instance canonique de la chaîne. Mais cela permet à la chaîne que vous avez transmise à stagiaire () code> (par exemple, le récepteur d'appel / l'objet que vous appelez la méthode sur) est retourné - cela peut arriver si la chaîne n'est pas encore dans la table interne - - Que est em> l'instance canonique maintenant. De la même manière, si cette chaîne était déjà dans la table des chaînes internes, stagiaire () code> le retournerait.

String s2 = "web".concat("sarvar");
String s3 = s2.intern();
System.out.println(s2 == s3); // prints "true"

String s4 = "web".concat("sarvar");
String s5 = s4.intern();
System.out.println(s4 == s5); // prints "false"


5 commentaires

stagiaire ne prend pas d'arguments. Pouvez-vous clarifier ce que vous voulez dire?


Imprime "False" - Euh, Nope . Il n'y a pas encore de "WebSarvar" dans la piscine, donc S2 est ajouté à la piscine et renvoyé.


Yup, désolé, corrigé l'exemple et l'explication.


@EJP: Vous ne pouvez certainement pas dire que "S2" est un argument , mais vous pouvez discuter avec certitude que "S2" est transmis comme ce lors de l'invocation de la méthode virtuelle.


Vous n'avez toujours pas expliqué la différence entre 6 et 8.