2013-03-21 19 views
5

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

+0

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

Odpowiedz

6

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.

0

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 „==”

+1

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

+0

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

4

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 Objectequals klasa za porównuje równości odniesienia two obiektu za pomocą == symbol. Kod jest podany powyżej.

Powiązane problemy