Zbudowałem klasę z jednym String
polem. Następnie utworzyłem dwa obiekty i muszę je porównać za pomocą ==
operatora i .equals()
też. Oto, co zrobiłem:
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));
}
}
Po kompilacji w rezultacie pokazuje dwa razy fałsz. Dlaczego jest fałszem, jeśli dwa obiekty mają te same pola - „test”?
equals
iequals2
: za każdym razem, gdy masz coś w formieif(a) { return true; } else { return false; }
, prawdopodobnie powinieneś po prostu napisaćreturn a
.true
jeśli tak jest , a jeślifalse
nie. Na przykładif(a.equals(object2)) { return true; } else return false
może byćreturn a.equals(object2)
.Odpowiedzi:
==
porównuje odniesienia do obiektów, sprawdza, czy dwa operandy wskazują ten sam obiekt (nie równoważne obiekty, ten sam obiekt).Jeśli chcesz porównać ciągi (aby zobaczyć, czy zawierają te same znaki), musisz porównać ciągi za pomocą
equals
.W twoim przypadku, jeśli dwa wystąpienia
MyClass
naprawdę są uważane za równe, jeśli ciągi pasują do siebie, to:public boolean equals(Object object2) { return object2 instanceof MyClass && a.equals(((MyClass)object2).a); }
... ale zwykle, jeśli definiujesz klasę, równoważność polega na czymś więcej niż na równoważności pojedynczego pola (
a
w tym przypadku).Uwaga dodatkowa: jeśli nadpisujesz
equals
, prawie zawsze musisz go zastąpićhashCode
. Jak jest napisane wequals
JavaDoc :źródło
Powinieneś zastąpić równa się
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()); }
źródło
if (this == null)
sprawa i tak jest niepotrzebna; wywołanienullObject.equals(whatever)
spowoduje zgłoszenie wyjątku wskaźnika o wartości null, więc możemy bezpiecznie założyć, żethis
nie ma wartości null w żadnej z metod Javy, które możemy napisać.this
malastname
wartość null i nie spełnia poprzednich warunków.Wygląda na
equals2
to, że dzwoniequals
, więc da te same wyniki.źródło
equals
metodę String,a
która jest członkiem klasy.equals2
nie dzwoniequals
Funkcja nadpisywania równa się () jest nieprawidłowa. Obiekt „a” jest instancją klasy String, a „object2” jest instancją klasy MyClass . Są to różne klasy, więc odpowiedź brzmi „fałsz”.
źródło
Najlepszym sposobem porównania 2 obiektów jest przekonwertowanie ich na ciągi json i porównanie ciągów, co jest najłatwiejszym rozwiązaniem w przypadku skomplikowanych zagnieżdżonych obiektów, pól i / lub obiektów zawierających tablice.
próba:
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 }
źródło
Gson
obiektu, a następnie wywoływaniatoJson
. TworzenieGson
obiektu i wywoływanie logiki potrzebnej do konwersji rzeczywistego obiektu na flatString
(toJson
) jest zbędnym narzutem. Możesz porównać obiekty bez uprzedniej konwersji obiektów na ciągi Json (co jest również szybsze).Twoja
equals2()
metoda zawsze zwróci to samo coequals()
!!Twój kod z moimi komentarzami:
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 }
źródło
return a.equals(object2);
Instrukcje
a == object2
ia.equals(object2)
oba zawsze będą zwracane,false
ponieważa
jest astring
whileobject2
jest wystąpieniemMyClass
źródło
Twoja realizacja musi lubić:
public boolean equals2(Object object2) { if(a.equals(object2.a)) { return true; } else return false; }
W tej implementacji obie metody będą działać.
źródło
Jeśli nie potrzebujesz dostosowywać domyślnej funkcji toString (), innym sposobem jest nadpisanie metody toString (), która zwraca wszystkie atrybuty do porównania. następnie porównaj wyjście toString () dwóch obiektów. Wygenerowałem metodę toString () za pomocą IDE IntelliJ IDEA, która zawiera nazwę klasy w ciągu.
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 + '\'' + '}'; } }
źródło
Operator „==” zwraca prawdę tylko wtedy, gdy dwa odwołania wskazują na ten sam obiekt w pamięci. Z drugiej strony metoda equals () zwraca wartość true na podstawie zawartości obiektu.
Przykład:
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);
Wynik: Porównanie dwóch ciągów z operatorem ==: false Porównywanie dwóch ciągów o tej samej zawartości przy użyciu metody equals: true Porównanie dwóch odwołań wskazujących na ten sam ciąg z operatorem ==: prawda
Więcej informacji można również uzyskać pod linkiem: http://javarevisited.blogspot.in/2012/12/difference-between-equals-method-and-equality-operator-java.html?m=1
źródło
Twoja klasa może zaimplementować interfejs porównywalny, aby osiągnąć tę samą funkcjonalność. Twoja klasa powinna implementować metodę compareTo () zadeklarowaną w interfejsie.
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"); } } }
źródło
zwracany typ object.equals jest już logiczny. nie ma potrzeby owijania go w metodę z gałęziami. więc jeśli chcesz porównać 2 obiekty, po prostu je porównaj:
boolean b = objectA.equals(objectB);
b jest już prawdą lub fałszem.
źródło
Kiedy używamy ==, odniesienie obiektu jest porównywane, a nie rzeczywiste obiekty. Musimy nadpisać metodę equals, aby porównać obiekty Java.
Niektóre dodatkowe informacje C ++ ma przeciążenie operatora, a Java nie zapewnia przeciążenia operatora. Inne możliwości w java to implementacja interfejsu Compare, który definiuje metodę compareTo.
Interfejs komparatora jest również używany do porównywania dwóch obiektów
źródło
Tutaj wynik będzie fałszywy, fałszywy, ponieważ w pierwszej instrukcji sopln próbujesz porównać zmienną typu string typu Myclass z innym typem MyClass i pozwoli to, ponieważ oba są typem Object i użyłeś operatora "==", który sprawdzi wartość zmiennej odniesienia przechowującej aktualną pamięć, a nie rzeczywiste elementy w pamięci. W drugim sopln jest tak samo, jak ponownie wywołujesz a.equals (object2), gdzie a jest zmienną wewnątrz object1. Daj mi znać swoje ustalenia w tej sprawie.
źródło
W poniższym kodzie wywołujesz metodę overriden .equals ().
public boolean equals2 (Object object2) {if (a.equals (object2)) {// tutaj wywołujesz metodę overriden, dlatego dwa razy otrzymujesz false. powrót prawda; } else zwraca false; }
źródło
a.equals
to metoda stringów, nigdzie nie jest zastępowana.