Bien que la question sur les chaînes Java "==" et "equals" soit la question la plus fondamentale de l'apprentissage Java, il y a encore de nombreux étudiants qui viennent d'apprendre Java et qui ne comprennent pas les principes dont j'ai récemment discuté avec mes amis. , j'ai donc écrit un article pour partager avec vous ma propre compréhension.
Regardons d'abord un exemple :
Copiez le code comme suit :
classe publique TestStringEquals {
public static void main (String[] arguments) {
Chaîne a = "test" ;
Chaîne b = "test" ;
Chaîne c = new String("test");
Chaîne d = new String("test");
Chaîne e = a ;
Chaîne f = nouvelle chaîne (a);
Chaîne g = a + "" ;
System.out.println(a == b ? "l'expression /"a==b/" est vraie"
: "l'expression /"a==b/" est fausse");
System.out.println(a == c ? "l'expression /"a==c/" est vraie"
: "l'expression /"a==c/" est fausse");
System.out.println(c == d ? "l'expression /"c==d/" est vraie"
: "l'expression /"c==d/" est fausse");
System.out.println(a == e ? "l'expression /"a==e/" est vraie"
: "l'expression /"a==e/" est fausse");
System.out.println(a == f ? "l'expression /"a==f/" est vraie"
: "l'expression /"a==f/" est fausse");
System.out.println(a == g ? "l'expression /"a==g/" est vraie"
: "l'expression /"a==g/" est fausse");
si (a.equals(b) && b.equals(c) && c.equals(d) && d.equals(e)
&& e.equals(f) && f.equals(g)) {
Système.out
.println("a est égal à b est égal à c est égal à d est égal à e est égal à f est égal à g");
}
}
}
Si vous n’avez pas encore la réponse, essayons de le faire. Pouvez-vous garantir que tout est correct ?
La réponse est annoncée ci-dessous :
Copiez le code comme suit :
l'expression "a==b" est vraie
l'expression "a==c" est fausse
l'expression "c==d" est fausse
l'expression "a==e" est vraie
l'expression "a==f" est fausse
l'expression "a==g" est fausse
<div style="text-align: left;"></div>a est égal à b est égal à c est égal à d est égal à e est égal à f est égal à g
Pour bien comprendre ce genre de problème, le meilleur moyen est d'avoir une compréhension approfondie du mécanisme et des principes de la méthode "==" et de la méthode "equals" de String en Java. Tout le monde doit savoir que "égal" consiste à comparer le contenu des chaînes puisque tous les contenus de chaîne dans le programme ci-dessus sont "test", ils seront tous égaux par rapport aux égaux.
Mais savez-vous que la méthode equals et la méthode "==" de la classe de base Object en Java sont en réalité les mêmes ? C'est juste qu'une fois que la classe String a hérité de la classe Object (toutes les classes en Java héritent de la classe Object), elle surcharge la méthode égale, ce qui en fait une comparaison du contenu de la chaîne.
Après avoir bien compris les égaux, étudions maintenant les subtilités de la méthode "==".
"==" est un opérateur en Java. Le contenu qu'il compare est constitué des pointeurs de deux objets, qui sont l'adresse de l'objet réel. Il est donc facile de comprendre que e==a renvoie vrai.
Regardons à nouveau la comparaison entre c et d. Lorsque nous voyons le nouveau mot-clé, cela signifie que c et d ont tous deux demandé une adresse mémoire, puis ont attribué la valeur "test", donc c==d renvoie false. C'est compréhensible de la même manière
L'opération "==" entre a, c, d et f renvoie toutes false.
Regardons ensuite g= a + "". Bien que nous ne voyions pas le nouveau mot-clé, puisque l'opérateur de la classe String "+" est surchargé, une nouvelle String sera définitivement ajoutée dans la méthode surchargée, elle devient donc ce qui précède. situation. Ensuite, la chose la plus difficile à comprendre est la comparaison entre a et b. En fait, c'est le résultat de l'optimisation du compilateur Java. Le compilateur Java dispose d'une zone de stockage appelée pool de constantes de chaîne. Puisque String a = "test". Une fois l'instruction compilée, "test" sera stocké dans ce pool de constantes de chaîne. Ensuite, lorsque b sera défini à nouveau, b pointe toujours vers cette zone, donc a et b pointent toujours vers la même zone. Donc a==b renvoie vrai.