Vergelijk twee objecten met .equals() en == operator

Ik heb een klasse geconstrueerd met één String-veld. Vervolgens heb ik twee objecten gemaakt en ik moet ze vergelijken met de operator ==en ook .equals(). Dit is wat ik heb gedaan:

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));
    }
}

Na het compileren toont het twee keer false als resultaat. Waarom is het onwaar als de twee objecten dezelfde velden hebben – “test”?


Antwoord 1, autoriteit 100%

==vergelijkt objectreferenties, het controleert of de twee operanden naar hetzelfde object verwijzen (niet equivalenteobjecten, maar dezelfdeobject).

Als je strings wilt vergelijken (om te zien of ze dezelfde karakters bevatten), moet je de strings vergelijken met equals.

In jouw geval, als twee instanties van MyClassecht als gelijk worden beschouwd als de strings overeenkomen, dan:

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

…maar meestal als je een klasse definieert, is gelijkwaardigheid meer dan de gelijkwaardigheid van een enkel veld (in dit geval a).


Kanttekening: als u equalsoverschrijft, moet u bijna altijd hashCode. Zoals het zegt in de equalsJavaDoc:

Merk op dat het over het algemeen nodig is om de hashCode-methode te negeren wanneer deze methode wordt overschreven, om het algemene contract voor de hashCode-methode te behouden, waarin staat dat gelijk is aan objecten moeten gelijke hashcodes hebben.


Antwoord 2, autoriteit 13%

Je moet gelijken overschrijven

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

Antwoord 3, autoriteit 5%

De beste manier om 2 objecten te vergelijken is door ze om te zetten in json-tekenreeksen en de tekenreeksen te vergelijken. Dit is de gemakkelijkste oplossing als je te maken hebt met gecompliceerde geneste objecten, velden en/of objecten die arrays bevatten.

voorbeeld:

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
}

Antwoord 4, autoriteit 4%

De overschrijffunctie is gelijk aan() is verkeerd.
Het object “a” is een instantie van de klasse Stringen “object2” is een instantie van de klasse MyClass. Het zijn verschillende klassen, dus het antwoord is “false”.


Antwoord 5, autoriteit 3%

Het lijkt erop dat equals2gewoon equalsaanroept, dus het geeft dezelfde resultaten.


Antwoord 6, autoriteit 2%

Uw equals2()-methode zal altijd hetzelfde retourneren als equals()!!

uw code Met mijn opmerkingen:

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
}

Antwoord 7

Verklaringen a == object2EN a.equals(object2)Beide zullen altijd terugkeren falseomdat ais een stringterwijl object2een exemplaar van MyClass

is


Antwoord 8

Uw implementatie moet graag:

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

Met deze implementatie zouden beide methoden werken.


Antwoord 9

Als u de functie Standaard TOSTRING () niet hoeft aan te passen, is een andere manier om de methode van TOSTRING () te negeren, die alle kenmerken retourneert die moeten worden vergeleken. Vergelijk vervolgens de output van twee objecten. Ik gegenereerde ToString () -methode met behulp van Intellij Idea IDE, inclusief klasnaam in de tekenreeks.

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 + '\'' +
            '}';
}
}

Antwoord 10

De operator “==” retourneert alleen als de twee referenties naar hetzelfde object in het geheugen wijzen. De methode van de gelijken () geeft aan de andere kant true op basis van de inhoud van het object.

Voorbeeld:

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 personalLoan 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);

Uitgang:
Vergelijken van twee snaren met == operator: false
Het vergelijken van twee snaren met dezelfde inhoud met gelijkende methode: waar
Het vergelijken van twee referenties die naar dezelfde reeks met == operator: TRUE

U kunt ook meer informatie ontvangen van de link: http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-ands-equality-operator-java.html?m=1


Antwoord 11

Uw klasse kan de vergelijkbare interface implementeren om dezelfde functionaliteit te bereiken. Uw klasse moet de methode vergelijken () uitvoeren die in de interface is gedeclareerd.

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.
        */
        return this.a.compareTo(someMyClass.a);
    }
    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");
        }
    }
}

Antwoord 12

het retourtype van object.equals is al booleaans.
het is niet nodig om het in een methode met vertakkingen te wikkelen. dus als je 2 objecten wilt vergelijken, vergelijk ze dan gewoon:

boolean b = objectA.equals(objectB);

b is al waar of onwaar.


Antwoord 13

Als we == gebruiken, wordt de referentie van het object vergeleken, niet de werkelijke objecten. We moeten de equals-methode overschrijven om Java-objecten te vergelijken.

Enkele aanvullende informatie C++ heeft operator over laden & Java biedt geen operator overload.
Ook andere mogelijkheden in Java zijn het implementeren van Compare Interface.die een CompareTo-methode definieert.

Vergelijkingsinterfacewordt ook gebruikt om twee objecten te vergelijken


Antwoord 14

Hier is de uitvoer false , false omdat u in de eerste sopln-instructie een stringtypevariabele van het Myclass-type probeert te vergelijken met het andere MyClass-type en dit zal toestaan ​​omdat beide objecttype zijn en u “== “-operator die de waarde van de referentievariabele controleert die het daadwerkelijke geheugen bevat, niet de daadwerkelijke contnets in het geheugen.
In de tweede sopln is het ook hetzelfde als je opnieuw a.equals(object2) aanroept, waarbij a een variabele is binnen object1 . Laat me je bevindingen hierover weten.


Antwoord 15

IN de onderstaande code roept u de overschreven methode .equals() aan.

public boolean equals2(Object object2) {
if(a.equals(object2)) { // hier roep je de overschreven methode aan, daarom krijg je 2 keer false.
retourneer waar;
}
anders vals retourneren;
}

Other episodes