Lorsque vous apprenez Java pour la première fois, vous pouvez souvent rencontrer le code suivant :
1 String str1 = new String("hello");
2 String str2 = new String("hello");
3
4 System.out.println(str1==str2);
5 System.out.println (str1.equals(str2));
Pourquoi les résultats de sortie des lignes 4 et 5 sont-ils différents ? Quelle est la différence entre les méthodes == et égales ? Si vous ne comprenez pas cela lorsque vous apprenez Java pour la première fois, vous ferez des erreurs de bas niveau lors de l'écriture du code à l'avenir. Aujourd'hui, découvrons la différence entre les méthodes == et égales.
1. Que compare exactement l'opérateur relationnel "==" ?
La phrase suivante est extraite du livre "Java Programming Thoughts" :
"Les opérateurs relationnels produisent un booléen résultat, et ils calculent une relation entre les valeurs de leurs opérandes."
Cette phrase semble simple, mais elle doit encore être comprise attentivement. Pour faire simple, == est utilisé pour comparer si les valeurs sont égales. Regardons quelques exemples :
classe publique Principale {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Stub de méthode généré automatiquement
int n=3;
int m=3;
System.out.println(n==m);
String str = new String("bonjour" );
String str1 = new String("bonjour");
String str2 = new String("bonjour");
Système. out.println(str1==str2);
str1 = str;
str2 = str;
System.out.println(str1= =str2);
}
}
Le résultat de sortie est vrai faux vrai
Le résultat de n==m est vrai. C'est facile à comprendre. Les valeurs stockées dans la variable n et la variable m sont toutes deux égales à 3. Et pourquoi les résultats des deux comparaisons de str1 et str2 sont-ils différents ? Pour comprendre cela, il vous suffit de comprendre la différence entre les variables de type de données de base et les variables de type de données non basiques.
Il existe 8 types de données de base en Java :
Type à virgule flottante : float (4 octets), double (8 octets)
Type entier : octet (1 octet), court (2 octets), int (4 octets) , long (8 octets)
Type de caractère : char(2 octets)
Type booléen : booléen (la spécification JVM ne précise pas clairement la taille de l'espace qu'elle occupe, mais stipule seulement qu'elle ne peut prendre que les valeurs littérales" vrai" et "faux")
Pour les variables de ces 8 types de données de base, les variables stockent directement des "valeurs", donc lors de la comparaison à l'aide de l'opérateur relationnel = =, comparer est la "valeur" elle-même. Il convient de noter que les types à virgule flottante et entier sont des types signés, tandis que char est un type non signé (la plage de valeurs du type char est 0~2^16-1).
Soit par exemple :
int n=3;
int m=3;
La variable n et la variable m stockent toutes deux directement la valeur "3", donc par rapport à ==, le résultat est vrai.
Pour les variables de types de données non basiques, elles sont appelées variables de type référence dans certains livres. Par exemple, str1 ci-dessus est une variable de type référence. Une variable de type référence ne stocke pas la "valeur" elle-même, mais l'adresse de son objet associé en mémoire. Par exemple, la ligne de code suivante :
String str1;
Cette phrase déclare une variable de type référence, Il n’est associé à aucun objet pour le moment.
Utilisez new String("hello") pour générer un objet (également appelé instance de la classe String), et liez cet objet à str1 :
str1= new String("hello");
Ensuite, str1 pointe vers un objet (str1 est également appelé à de nombreux endroits Référence d'objet), à ce moment, la variable str1 stocke l'adresse de stockage de l'objet vers lequel elle pointe dans la mémoire, pas la "valeur" elle-même, c'est-à-dire qu'il ne s'agit pas de la chaîne "hello" directement stockée. Les références ici sont très similaires aux pointeurs en C/C++.
Ainsi, lorsque vous utilisez == pour comparer str1 et str2 pour la première fois, le résultat est faux. Par conséquent, ils pointent respectivement vers des objets différents, ce qui signifie que les adresses mémoire où ils sont réellement stockés sont différentes.
Dans la deuxième comparaison, str1 et str2 pointent tous deux vers l'objet pointé par str, donc le résultat est sans aucun doute vrai.
2. Qu'est-ce que égal à comparer ?
La méthode equals est une méthode de la classe de base Object, donc toutes les classes qui héritent de Object auront cette méthode. Afin de comprendre plus intuitivement le rôle de la méthode Equals, regardons directement l'implémentation de la méthode Equals dans la classe Object.
Le chemin du code source de cette classe est : Object.java sous le chemin java.lang de src.zip dans C:Program FilesJavajdk1.6.0_14 (en fonction du chemin d'installation personnel du jdk ).
Ce qui suit est l'implémentation de la méthode equals dans la classe Object :
Très évidemment, dans la classe Object, la méthode equals est utilisée pour comparer si les références de deux objets sont égales, c'est-à-dire si elles pointent vers le même objet.
Mais certains amis peuvent encore avoir des questions, pourquoi le résultat de sortie du code suivant est-il vrai ?
classe publique Main {
/**
* @param args
*/
public static void main( String[] args) {
// TODO Stub de méthode généré automatiquement
String str1 = new String("hello");
String String str2 = new String("bonjour");
System.out.println(str1.equals(str2));
}
}
Pour connaître les détails, vous pouvez consulter l'implémentation spécifique de la méthode equals de la classe String Également sous ce chemin, String.java se trouve l'implémentation du. Classe de chaînes.
Ce qui suit est l'implémentation spécifique de la méthode equals dans la classe String :
On peut voir que la classe String remplace la méthode equals pour comparer si les chaînes stockées dans les objets chaîne pointés sont égales.
Certaines autres classes, telles que Double, Date, Integer, etc., ont remplacé la méthode égale pour comparer si le contenu stocké dans les objets pointés est égal.
En résumé :
1) Pour ==, s'il agit sur une variable d'un type de données de base, sa " "valeur stockée " est égal;
S'il agit sur une variable de type référence, la comparaison est l'adresse de l'objet pointé
2) Pour méthode égal, remarque : la méthode égal ne peut pas agir sur les variables des types de données de base
Si la méthode égale n'est pas remplacée, l'adresse de l'objet pointé par la variable de type référence est comparée . ;
Si des classes telles que String et Date remplacent la méthode égale, le contenu des objets pointés est comparé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!