Il semble que JDK7 processus de stagiaire dans une manière différente comme avant.
Je l'ai testé avec la version 1.7.0-b147 et a obtenu "les deux sont égaux", mais lors de l'exécution (même bytecode) avec 1,6.0_24 je ne reçois pas le message.
Il a également dépend de l'endroit où l' String b2 =...
ligne est située dans le code source. Le code suivant n'a pas aussi de sortie le message:
class Test {
public static void main(String... args) {
String s1 = "Good";
s1 = s1 + "morning";
String s2 = "Goodmorning";
System.out.println(s1.intern()); //just changed here s1.intern() and the if condition runs true
if(s1 == s2) {
System.out.println("both are equal");
} //now it works.
}
}
il semble que l' intern
après ne pas trouver le String dans sa piscine de chaînes, insère l'instance réelle s1 dans la piscine. La JVM est à l'aide de la piscine lorsque s2 est créé, il obtient la même référence que s1 dos. De l'autre côté, si s2 est créé en premier, que la référence est stockée dans la piscine.
Cela peut être à la suite du déménagement de l'interné fils de la génération permanente du tas Java.
Trouvé ici: Important RFEs Abordées dans le JDK 7
Dans le JDK 7, interné les chaînes ne sont plus attribués dans la génération permanente du tas Java, mais sont à la place allouée à la partie principale de la Java heap (connu comme les jeunes et les anciennes générations), avec les autres objets créés par l'application. Ce changement se traduira par plus de données résidant dans le principal segment Java, et moins de données dans la génération permanente, et peut donc exiger que les tailles de tas pour être ajusté. La plupart des applications ne verrez que très peu de différences dans l'utilisation du tas à cause de ce changement, mais de plus grandes applications qui se chargent de nombreuses classes ou de faire un usage intensif de la Chaîne.stagiaire() la méthode verra de plus en plus de différences significatives.
Pas sûr si c'est un bug et à partir de la version... Le JLS 3.10.5 unis
Le résultat explicitement interner une angiographie de la chaîne est la même chaîne que tous les pré-existantes chaîne littérale avec le même contenu.
donc, la question est de savoir comment pré-existant est interprété, au moment de la compilation ou de l'exécution en temps: "Goodmorning" pré-existant ou pas?
Je préfère la façon dont il a ÉTÉ mis en œuvre avant le 7...