5 Réponses :
Le == code> contrôle des panneaux Si les références aux variables sont les mêmes. Pour vérifier si un objet est égal à un autre objet d'utilisation.equals (objet O) comme celui-ci: e.equals(a);
de JLS 4.3. 3. La chaîne de classe
L'opérateur de concaténation de chaîne
+ code> (§15.18.1) crée implicitement un nouvel objet de chaîne lorsque le résultat n'est pas une expression constante de la compilation (§15.28). P> blockQuote>Parce que la valeur littérale d'A est
"helloworld" code> et la valeur littérale de D est un objet de référence deB code> +C code> Ce n'est pas un littéral comme de ci-dessusJLS 4.3.3 fort>. p> de JLS 3.10.5 Literie de chaîne P>
Un littéral à chaîne consiste en zéro ou plusieurs caractères enfermés dans des guillemets doubles. P> blockQuote>
de 15.28 . Expressions constantes p>
Une expression constante de la compilation est une expression désignant une valeur de type primitif ou une chaîne qui ne fonctionne pas brusquement et est composée en utilisant uniquement les éléments suivants: P>
- littéraux de type primitif et littéraux de type de type (§3.10.1, §3.10.2, §3.10.3, §3.10.4, §3.10.5) LI> ul> blockquote>
si vous voulez faire
system.out.println (a == d); code> true strud> Utilisezfinal code> Ci-dessous Code: P>String a="hello"+"world"; //line 1 final String b="hello"; // now b is a literal final String c="world";// now c is a literal String d=b+c; String e="helloworld"; System.out.println(e==a); System.out.println(a==d);// now it will be true because both are literals.
D est un objet de référence de C + B code> et non a + b code>
@sumit J'ai encore un doute dans la représentation interne de la ligne 1. La représentation interne de la ligne 1 est la nouvelle StringBuilder ("Bonjour"). Ajoutez ("World"). Tostring ()?
@nantiv Quel est ton doute?
@Sumitsingh a mis à jour le doute
@nantiv voir la réponse
@Sumitsingh merci. Pour obtenir plus de clarification -> La représentation interne de la ligne 1 est la nouvelle StringBuilder ("Bonjour"). Ajoutez ("World"). Tostring ()?
De votre dernière mise à jour de la réponse, la représentation interne de la ligne 1 n'est pas "New StringBuilder (" Bonjour "). Ajoutez (" World "). Tostring ()"
Le La raison pour laquelle == code> Opérateur vérifie l'égalité de référence, pas l'égalité d'objet. Dans votre exemple, deux String code> Les instances avec contenu "helloworld" code> ont été créés. Les variables A code> et E code> se réfectent à la même instance (voir ci-dessous), tandis que a code> et d code> ne le font pas. L'égalité des chaînes peut être vérifiée avec la méthode Equals () code>, c'est-à-dire a.equals (d) code> est vrai. P>
a code> et E code> se réfère à la même instance est que les constantes de chaîne sont internées. Chaque fois qu'une chaîne constante, comme "helloworld" code> est rencontrée, on vérifie si une telle constante était déjà rencontrée, et si elle l'ait, l'ancienne instance code> est renvoyée. au lieu de créer un nouveau. Bien que "bonjour" + "World" code> ne ressemble pas à une constante de chaîne, il est optimisé à une constante de chaîne par le compilateur Java, et il est donc interné comme E code>, C'est pourquoi a == e code> est vrai. Dans constraste, B + C code> n'est pas optimisé à une constante, c'est pourquoi a == d code> est faux (cependant, a.equals (d) code> serait vrai). P>
Le le L'expression Utiliser == code> vérifie si les deux objets se rapportent au même endroit en mémoire. P>
a = "bonjour" + "monde;" code> est évalué vers le littéral "helloworld" code> et e = "helloworld" code> est donné . Ils se réfèrent à la même position de mémoire. D'où l'expression e == a code> est évaluée à true. P>
d = b + c code> est également évaluée vers "helloworld" code> mais ce résultat est stocké à un emplacement différent. Il ne fait pas référence au même objet. D'où l'expression a == d code> est évaluée sur false. P>
a.equals (d) code> verrera true car est égal () code> vérifie le contenu des 2 objets. P>
1) C'est parce que les objets string em> sont immuables. Une fois que vous avez créé un objet string em> et attribuez-lui une valeur, elle a la même valeur pour toujours que cela ne puisse pas être modifié. Ainsi, il y a toujours créé un nouvel objet string em> lorsque vous effectuez des opérations avec elle (par exemple de jointure). dans le tas, il y en a une partie spéciale qui sert de piscine pour Cordes em> constantes. Si le compilateur rencontre un littéral em> string em>, il examine d'abord cette partie de la mémoire si un objet identique ( chaîne em>) existe déjà. Si tel est le cas, il attribue une référence à cet objet déjà existant ( string em>) au lieu de créer un nouveau. (C'est la raison pour laquelle String em> s est immuable, donc personne ne peut le changer. Parce que si plusieurs références indiquaient que cette string em> et l'une d'elles changerait sa valeur, Cela créerait un gâchis.) p> Jetons un coup d'œil à ce qui se passe dans cette extrait de code et essayons de trouver la réponse à vos deux questions à la fois. P> (1) String a="hello"+"world"; //line 1
(2) String b="hello"; // now b is a literal
(3) String c="world";
(4) String d=b+c;
(5) String e="helloworld";
(6) System.out.println(e==a);
(7) System.out.println(a==d);