The standard Java library contains more than 150 equals methods. Here is a perfect implementation method.
1) The display parameter is named otherobject and needs to be converted to another variable named other later.
2) check whether this and otherobject reference the same object:
If (this = otherobject) return true;
This statement is just an optimization. In fact, this is a frequently used form.
3) checks whether otherobject is null. If it is null, false is returned. This check is necessary.
If (otherobejct = NULL) return false;
Compare whether this and otherobject belong to the same class. If the equals semantics changes in each subclass, use getclass Detection:
If (getclass ()! = Otherobject. getclass () return false;
If all sub-classes have uniform semantics, use instanceof for detection:
If (! (Otherobejct instanceof classname) return false;
4) convert otherobject to the corresponding class type variable:
Classname Other = (classname) otherobject;
5) Now we start to compare all the domains to be compared. Use = to compare the basic type fields, and use equals to compare the object fields. If all the domains match, true is returned; otherwise, false is returned.
Return field = Other. Field & field. Equals (other. Field )&&...;
If you re-define equals in the subclass, you need to call Super. Equals (other ).
import java.util.*;public class EqualsTest{public static void main(String[] args){Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);Employee alice2 = alice1;Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);System.out.println("alice1 == alice2: " + (alice1 == alice2));System.out.println("alice1 == alice3: " + (alice1 == alice3));System.out.println("alice1.equals(alice3): " + alice1.equals(alice3));System.out.println("alice1.equals(bob): " + alice1.equals(bob));System.out.println("bob.toString(): " + bob);Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15);Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);boss.setBonus(5000);System.out.println("boss.toString(): "+ boss);System.out.println("carl.equals(boss): " + carl.equals(boss));System.out.println("alice1.hashCode(): " + alice1.hashCode());System.out.println("alice3.hashCode(): " + alice3.hashCode());System.out.println("bob.hashCode(): " + bob.hashCode());System.out.println("carl.hashCode(): " + carl.hashCode());}}class Employee{public Employee(String n, double s, int year, int month, int day){name = n;salary = s;GregorianCalendar calendar = new GregorianCalendar(year, month-1, day);hireDay = calendar.getTime();}public String getName(){return name;}public double getSalary(){return salary;}public Date getHireDay(){return hireDay;}public void raiseSalary(double byPercent){double raise = salary*byPercent/100;salary += raise;}public boolean equals(Object otherObject){//a quick test to see if the objects are identicalif(this == otherObject)return true;//must return false if the explicit parameter is nullif(otherObject == null)return false;//if the classes don't match, they can't be equalif(getClass() != otherObject.getClass())return false;//now we know otherObject is a non-null EmployeeEmployee other = (Employee)otherObject;//test whether the fields have identical valuesreturn name.equals(other.name)&& salary == other.salary&& hireDay.equals(other.hireDay);}public int hashCode(){return 7*name.hashCode() + 11*new Double(salary).hashCode()+ 13*hireDay.hashCode();}public String toString(){return getClass().getName() + "[name=" + name+ ",salary=" + salary + ",hireDay=" + hireDay+ "]";}private String name;private double salary;private Date hireDay;}class Manager extends Employee{public Manager(String n, double s, int year, int month, int day){super(n, s, year, month, day);bonus = 0;}public double getSalary(){double baseSalary = super.getSalary();return baseSalary + bonus;}public void setBonus(double b){bonus = b;}public boolean equals(Object otherObject){if(!super.equals(otherObject))return false;Manager other = (Manager)otherObject;//super.equals checked that this and other belong to the same classreturn bonus == other.bonus;}public int hashCode(){return super.hashCode() + 17*new Double(bonus).hashCode();}public String toString(){return super.toString() + "[bonus=" + bonus + "]";}private double bonus;}
Running result:
--------------------Configuration: <Default>--------------------alice1 == alice2: truealice1 == alice3: falsealice1.equals(alice3): truealice1.equals(bob): falsebob.toString(): Employee[name=Bob Brandson,salary=50000.0,hireDay=Sun Oct 01 00:00:00 CST 1989]boss.toString(): Manager[name=Carl Cracker,salary=80000.0,hireDay=Tue Dec 15 00:00:00 CST 1987][bonus=5000.0]carl.equals(boss): falsealice1.hashCode(): 377780067alice3.hashCode(): 377780067bob.hashCode(): 955285015carl.hashCode(): 386513600Process completed.