web-dev-qa-db-fra.com

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

J'ai construit une classe avec un champ String. Ensuite, j'ai créé deux objets et je dois les comparer en utilisant == operator et .equals(). 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, le résultat est deux fois faux. Pourquoi est-ce faux si les deux objets ont les mêmes champs - "test"?

65
Fastkowy

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

Si vous souhaitez comparer des chaînes (pour voir si elles contiennent les mêmes caractères), vous devez comparer les chaînes à l'aide de equals.

Dans votre cas, si deux instances de MyClass sont réellement considérées comme égales si les chaînes 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 est plus importante que l'équivalence d'un seul champ (a dans ce cas).


Remarque latérale: Si vous remplacez equals, vous devez presque toujours remplacer hashCode . Comme il est dit dans la equals JavaDoc :

Notez qu'il est généralement nécessaire de remplacer la méthode hashCode chaque fois que cette méthode est remplacée, de manière à conserver le contrat général de la méthode hashCode, qui indique que les objets identiques doivent avoir des codes de hachage égaux.

117
T.J. Crowder

vous devriez remplacer égal 

 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());
   }
16
user5119219

Il semble que equals2 appelle juste equals, donc il donnera les mêmes résultats.

5
Hew Wolff

Le meilleur moyen de comparer 2 objets est de les convertir en chaînes JSON et de comparer les chaînes. C'est la solution la plus simple pour traiter des objets, champs et/ou objets imbriqués complexes 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
}
4
JoeG

La fonction overwrite equals () est incorrecte . L'objet "a" est une instance de String class et "object2" est une instance de MyClass class. Ce sont des classes différentes, donc la réponse est "faux".

Votre méthode equals2() retournera toujours la même chose que equals() !!

Votre code avec mes commentaires:

public boolean equals2(Object object2) {  // equals2 method
    if(a.equals(object2)) { // if equals() method returns true
        return true; // return true
    }
    else return false; // if equals() method returns false, also return false
}
4
jlordo

Les instructions a == object2 et a.equals(object2) renvoient toujours false car a est une string alors que object2 est une instance de MyClass

2
ashish.al

Votre implémentation doit ressembler à:

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

Avec cette implémentation, vos deux méthodes fonctionneraient.

2
Azhar Khan

Votre classe pourrait implémenter l'interface Comparable pour obtenir la même fonctionnalité. Votre classe devrait implémenter la méthode compareTo () déclarée dans l'interface.

public class MyClass implements Comparable<MyClass>{

    String a;

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

    // returns an int not a boolean
    public int compareTo(MyClass someMyClass){ 

        /* The String class implements a compareTo method, returning a 0 
           if the two strings are identical, instead of a boolean.
           Since 'a' is a string, it has the compareTo method which we call
           in MyClass's compareTo method.
        */

        if(this.a.compareTo(someMyClass.a) == 0) return 0; 
        return 1;
    }

    public static void main(String[] args){

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

        if(object1.compareTo(object2) == 0){
            System.out.println("true");
        }
        else{
            System.out.println("false");
        }
    }
}
2
tectonicfury

Lorsque nous utilisons ==, la référence d'objet est comparée et non les objets réels. Nous devons redéfinir la méthode equals pour comparer les objets Java. 

Quelques informations supplémentaires C++ a l'opérateur over load et Java ne fournit pas l'opérateur over load . D'autres possibilités en Java sont aussi implémenter Compare Interface .qui définit une méthode compareTo. 

Interface comparateur est également utilisé pour comparer deux objets

1
umesh atada

le type de retour de object.equals est déjà boolean . il n'est pas nécessaire de l'envelopper dans une méthode avec des branches. donc si vous voulez comparer 2 objets, comparez-les simplement:

boolean b = objectA.equals(objectB);

b est déjà vrai ou faux.

1
Cpt. Mirk

L'opérateur "==" ne renvoie vrai que si les deux références pointant vers le même objet en mémoire. La méthode equals (), de son côté, renvoie true en fonction du contenu de l'objet.

Exemple:

String personalLoan = new String("cheap personal loans");
String homeLoan = new String("cheap personal loans");

//since two strings are different object result should be false
boolean result = personalLoan == homeLoan;
System.out.println("Comparing two strings with == operator: " + result);

//since strings contains same content , equals() should return true
result = personalLoan.equals(homeLoan);
System.out.println("Comparing two Strings with same content using equals method: " + result);

homeLoan = personalLoan;
//since both homeLoan and personalLoand reference variable are pointing to same object
//"==" should return true
result = (personalLoan == homeLoan);
System.out.println("Comparing two reference pointing to same String with == operator: " + result);

Résultat: Comparaison de deux chaînes avec l'opérateur ==: false Comparaison de deux chaînes ayant le même contenu à l'aide de la méthode equals: true Comparaison de deux références pointant sur la même chaîne avec l'opérateur ==: true

Vous pouvez également obtenir plus de détails sur le lien: http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-Java.html?m=1

1
Madhan

Ici, la sortie sera fausse, fausse, parce que dans la première instruction sopln, vous essayez de comparer un type de chaîne varible de type Myclass à un autre type MyClass. vérifiera la valeur de la variable de référence contenant la mémoire réelle et non les contacts réels dans la mémoire. Dans le second système, il en va de même si vous appelez à nouveau a.equals (object2), où a est une variable dans object1. Faites-moi savoir vos conclusions à ce sujet.

1
Bidyadhar

Si vous n'avez pas besoin de personnaliser la fonction toString () par défaut, vous pouvez également remplacer la méthode toString (), qui renvoie tous les attributs à comparer. comparez ensuite toString () en sortie de deux objets. J'ai généré la méthode toString () à l'aide de l'IDE IntelliJ IDEA, qui inclut le nom de la classe dans la chaîne. 

public class Greeting {
private String greeting;

@Override
public boolean equals(Object obj) {
    if (this == obj) return true;
    return this.toString().equals(obj.toString());
}

@Override
public String toString() {
    return "Greeting{" +
            "greeting='" + greeting + '\'' +
            '}';
}
}
0
Qinjie