web-dev-qa-db-fra.com

Pourquoi devons-nous remplacer la méthode equals () en Java?

J'ai une certaine confusion quant à la raison pour laquelle nous substituons la méthode .equals.

Par exemple:

Test test1 = new Test(3);
Test test2 = new Test(3);

//The if comparison does the same thing that the overridden `.equals()` method does.
if(test1.equals(test2)){
    System.out.println("test1 and test2 are true in .equals()");
}

// Override .equals method.
public boolean equals(Object object) {
    if(object instanceof Test && ((Test)object).getValue() == this.t) {
        return true;
    } else {
        return false;
    }
}

Je ne comprends pas pourquoi nous devons remplacer la méthode .equals().

17
nakul

De l'article Override est égal à et hashCode en Java :

Implémentation par défaut de la classe equals () fournie par Java.lang.Object compare l'emplacement de la mémoire et uniquement renvoie true si deux variables de référence pointent vers le même emplacement mémoire, c’est-à-dire qu’elles ont le même objet.

Java recommande de remplacer la méthode egals et hashCode si l'égalité est en cours soit par voie logique, soit via une logique métier. : exemple:

de nombreuses classes dans Java la remplace, par exemple, String remplace Equals, dont l'implémentation de la méthode equals () renvoie true si le contenu de deux objets String est identique)

La classe wrapper Integer substitue les équivalents pour effectuer des comparaisons numériques, etc.

43
Grijesh Chauhan

Cela devrait suffire à répondre à votre question: http://docs.Oracle.com/javase/tutorial/Java/IandI/objectclass.html

La méthode equals() compare l'égalité de deux objets et renvoie true s'ils sont égaux. La méthode equals() fournie dans la classe Object utilise l'opérateur d'identité (==) Pour déterminer si deux objets sont égaux. Pour les types de données primitifs, cela donne le résultat correct. Pour les objets, cependant, ce n'est pas le cas. La méthode equals() fournie par Object teste si les références d'objet sont égales, c'est-à-dire si les objets comparés sont exactement le même objet.

Pour vérifier si deux objets sont égaux au sens de l'équivalence (contenant la même information), vous devez remplacer la méthode equals().

(Devis partiel - cliquez pour lire des exemples.)

20
Byron

. equals () n'effectue pas de comparaison intelligente pour la plupart des classes à moins que la classe ne la remplace. Si ce n'est pas défini pour une classe (utilisateur), il se comporte de la même façon que ==.

Référence: http://www.leepoint.net/notes-Java/data/expressions/22compareobjects.html http://www.leepoint.net/data/expressions/22compareobjects.html

6
sabergeek

Le comportement par défaut de Java.lang.Object consiste à comparer des références, mais cela ne convient pas à tous les types d'objet. Il existe des éléments appelés objets de valeur (tels que BigDecimal ou String), les objets avec la même valeur étant considérés comme interchangeables, le comportement par défaut d’égal à égal n’est donc pas souhaitable. Ces types d'objets doivent implémenter equals et hashcode en fonction de la valeur que l'objet prend.

3
Nathan Hughes

Pour répondre à votre question, je vous recommande tout d’abord de regarder Documentation .

Sans remplacer la méthode equals (), il agira comme "==". Lorsque vous utilisez l'opérateur "==" sur des objets, il vérifie simplement si ces pointeurs font référence au même objet. Pas si leurs membres contiennent la même valeur.

Nous remplaçons pour garder notre code propre et abstrayons la logique de comparaison de l'instruction If dans l'objet. Ceci est considéré comme une bonne pratique et tire parti de l'approche fortement orientée objet de Java.

2
christopher

Laissez-moi vous donner un exemple que je trouve très utile.

Vous pouvez penser à la référence comme au numéro de page d'un livre. Supposons maintenant que vous avez deux pages a et b comme ci-dessous.

BookPage a = getSecondPage ();

BookPage b = getThirdPage ();

Dans ce cas, a == b vous donnera false. Mais pourquoi? La raison en est que ce que fait == revient à comparer le numéro de page. Ainsi, même si le contenu de ces deux pages est exactement le même, vous obtiendrez toujours la valeur false.

Mais que faisons-nous si vous voulez comparer le contenu?

La réponse consiste à écrire votre propre méthode equals et à spécifier ce que vous voulez vraiment comparer.

2
user1559897

Par défaut, .equals () utilise la fonction d'identité == pour comparer ce qui ne fonctionne évidemment pas car les instances test1 et test2 ne sont pas identiques. == ne fonctionne qu'avec des types de données primitifs tels que int ou string. Donc, vous devez le remplacer pour le faire fonctionner en comparant toutes les variables membres de la classe Test

2
Basanta

La méthode Object.equals () vérifie uniquement la référence de l'objet, pas le type de données primitif ni la valeur de l'objet (objet de classe Wrapper des données primitives, type de données primitif simple (octet, court, int, long, etc.)). Nous devons donc surcharger la méthode equals () lorsque nous comparons un objet basé sur un type de données primitif.

1
App Kart