89 votes

Comparez deux objets avec .equals() et l'opérateur ==.

J'ai construit une classe avec un String champ. Ensuite, j'ai créé deux objets et je dois les comparer à l'aide de == opérateur et .equals() aussi. Voici ce que j'ai fait :

public class MyClass {

    String a;

    public MyClass(String ab) {
        a = ab;
    }

    public boolean equals(Object object2) {
        if(a == object2) { 
            return true;
        }
        else return false;
    }

    public boolean equals2(Object object2) {
        if(a.equals(object2)) {
            return true;
        }
        else return false;
    }

    public static void main(String[] args) {

        MyClass object1 = new MyClass("test");
        MyClass object2 = new MyClass("test");

        object1.equals(object2);
        System.out.println(object1.equals(object2));

        object1.equals2(object2);
        System.out.println(object1.equals2(object2));
    }

}

Après la compilation, il montre deux fois faux comme résultat. Pourquoi le résultat est-il faux si les deux objets ont les mêmes champs - "test" ?

154voto

T.J. Crowder Points 285826

== compare les références d'objets, il vérifie si les deux opérandes pointent vers le même objet (et non vers le même objet). équivalent les objets même objet).

Si vous voulez comparer des chaînes de caractères (pour voir si elles contiennent les mêmes caractères), vous devez comparer les chaînes de caractères en utilisant equals .

Dans votre cas, si deux instances de MyClass sont considérées comme égales si les chaînes de caractères correspondent, alors :

public boolean equals(Object object2) {
    return object2 instanceof MyClass && a.equals(((MyClass)object2).a);
}

...mais généralement, si vous définissez une classe, l'équivalence ne se limite pas à l'équivalence d'un seul champ ( a dans ce cas).


Remarque : si vous passez outre equals vous avez presque toujours besoin de remplacer hashCode . Comme il est dit dans le equals JavaDoc :

Notez qu'il est généralement nécessaire de remplacer l'option hashCode à chaque fois que cette méthode est surchargée, de manière à maintenir le contrat général pour la méthode hashCode qui stipule que des objets égaux doivent avoir des codes de hachage égaux.

21voto

user5119219 Points 235

Vous devez remplacer les égaux

 public boolean equals (Object obj) {
     if (this==obj) return true;
     if (this == null) return false;
     if (this.getClass() != obj.getClass()) return false;
     // Class name is Employ & have lastname
     Employe emp = (Employee) obj ;
     return this.lastname.equals(emp.getlastname());
 }

7voto

JoeG Points 162

La meilleure façon de comparer deux objets est de les convertir en chaînes json et de comparer ces chaînes. C'est la solution la plus simple lorsqu'il s'agit d'objets imbriqués compliqués, de champs et/ou d'objets contenant des tableaux.

échantillon :

import com.google.gson.Gson;

Object a = // ...;
Object b = //...;
String objectString1 = new Gson().toJson(a);
String objectString2 = new Gson().toJson(b); 

if(objectString1.equals(objectString2)){
    //do this
}

6voto

La fonction d'écrasement equals() est erronée. L'objet "a" est une instance de la classe Chaîne de caractères et "object2" est une instance de la classe MaClasse classe. Ce sont des classes différentes, la réponse est donc "faux".

5voto

Hew Wolff Points 825

On dirait que equals2 c'est juste appeler equals Les résultats seront donc les mêmes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X