Metoda equals
porównuje, czy dwie wartości obiektu są równe, czy nie. Moje pytanie brzmi, jak porównuje te dwa obiekty? Jak można powiedzieć, że oba obiekty są równe, czy nie? Chcę wiedzieć na podstawie tego, co porównuje te dwa obiekty. Nie uwzględniam metody hashCode
.Jak działa metoda equals() w Javie
Odpowiedz
Domyślna implementacja, jeden klasy java.lang.Object
, po prostu sprawdza odnośniki do tego samego obiektu:
150 public boolean equals(Object obj) {
151 return (this == obj);
152 }
Operator równości odniesienia jest opisany tak w Java Specification:
W czasie wykonywania wynik == jest prawdziwy, jeśli wartości argumentu są zarówno zerowe, jak i oba odnoszą się do tego samego obiektu lub tablicy; w przeciwnym razie wynik jest fałszywy.
To domyślne zachowanie zwykle nie jest satysfakcjonujące semantycznie. Na przykład nie można przetestować równość dużych instancji Integer użyciu ==
:
Integer a = new Integer(1000);
Integer b = new Integer(1000);
System.out.println(a==b); // prints false
Dlatego metoda ta jest przesłonięte:
722 public boolean equals(Object obj) {
723 if (obj instanceof Integer) {
724 return value == ((Integer)obj).intValue();
725 }
726 return false;
727 }
który umożliwia w ten sposób:
System.out.println(a.equals(b)); // prints true
Klasy przesłanianie domyślne zachowanie powinno testować dla równości semantycznej, w oparciu o równość identyfikacji pól (zwykle wszystkie z nich).
Jak się wydaje, należy odpowiednio zmienić metodę hashCode
.
logicznie, równy nie porównuje obiektów (jednak można z nim wszystko zrobić), porównuje wartości. dla porównania obiektu jest operator „==”
Nie zgadzam się . Equals porównuje obiekty w taki sposób, w jaki zostały utworzone. Jak wyjaśnił dystroy - zazwyczaj porównuje wartości, ale nie zawsze, i nie zawsze wszystkie. Na przykład. dla obiektów równych metoda zwykle porównuje tylko pole id. – robson
Wspomniałem: "logicznie" i "możesz wszystko". "equals" ma na celu porównanie obiektów "w sensie" w przeciwnym razie możesz nie mieć '==' dla obiektów. – Ankit
Rozważmy następujący przykład,
public class Employee {
String name;
String passportNumber;
String socialSecurityNumber;
public static void main(String[] args) {
Employee e1 = new Employee();
Employee e2 = new Employee();
boolean isEqual = e1.equals(e2); // 1
System.out.println(isEqual);
}
}
W kodzie w komentarzu // 1 wywołuje dziedziczone equals
metodę z klasy Object, która jest po prostu porównując referencje e1
i e2
. Więc zawsze da to false
dla każdego obiektu utworzonego za pomocą słowa kluczowego new
.
Poniżej znajduje się fragment metoda Address
public boolean equals(Object obj) {
return (this == obj);
}
do porównywania sprawdzić równość JLS dał equals
sposób, aby zastąpić w naszej klasie. To nie jest metoda ostateczna. JLS nie wie, na jakiej zasadzie program chce uczynić dwa obiekty równymi. Podali więc nieostateczną metodę nadpisania.
hashcode
nie odgrywa roli, by sprawdzić równość obiektu. hashcode
sprawdza/znajduje segment, w którym obiekt jest dostępny. używamy hashcode
w technikę mieszania, który jest używany przez niektórych klasach jak HashMap ..
Jeśli hashcode two obiektu są równi, że nie oznacza dwa obiekty są równe. Dla dwóch obiektów, jeśli metoda equals
zwraca wartość true, kod hashcode musi być taki sam.
Będziesz musiał zastąpić equals
sposobu decydowania, na podstawie których chcesz wyrazić sprzeciw e1
i e2
w powyższym kodzie jest równa. Czy jest to na podstawie passportNumber
lub socialSecurityNumber
lub kombinacji passportNumber+socialSecurityNumber
?
I want to know based on what it compares the two objects.
Odpowiedź jest domyślnie przy pomocy metody dziedziczone Object
equals
klasa za porównuje równości odniesienia two obiektu za pomocą == symbol. Kod jest podany powyżej.
Jeśli chcesz porównać obiekty, polecam zapoznać się z pomocnikiem obiektów biblioteki guava: https://code.google.com/p/guava-libraries/wiki/CommonObjectUtilitiesExplained – evgenyl