JavaにおけるequalsメソッドとハッシュコードhashCode
14299 ワード
次の例では、equalsメソッドをカスタマイズし、hashcodeを比較します.
Employeeクラス:
Employeeクラス:
package equals;
import java.time.*;
import java.util.Objects;
public class Employee {
private String name;
private double salary;
private LocalDate hireday;
public Employee(String aname,double asalary,int year,int month,int day){
this.name=aname;
this.salary=asalary;
hireday=LocalDate.of(year,month,day);
}
public String getName(){return name;}
public double getSalary(){return salary;}
public LocalDate getHireday(){return hireday;}
public void raiseSalary(double byPercent){
double raise=salary*byPercent/100;
salary+=raise;
}
public boolean equals(Object otherObject){
if(this==otherObject) return true;//identical
if(otherObject==null) return false;
if(getClass()!=otherObject.getClass()) return false;//classes
Employee other=(Employee)otherObject;
return Objects.equals(name,other.name) && salary==other.salary && Objects.equals(hireday,other.hireday);
}
public int hashCode(){return Objects.hash(name,salary,hireday);}
public String toString(){return getClass().getName()+"[name="+name+",salary="
+salary+",hireday"+hireday+"]" ;}
}
Manager类
package equals; public class Manager extends Employee { private double bonus; public Manager(String aname,double asalary,int year,int month,int day){ super(aname,asalary,year,month,day); bonus=0; } public double getSalary(){ double baseSalary=super.getSalary(); return baseSalary+bonus; } public void setBonus(double bonus){this.bonus=bonus;} public boolean equals(Object otherObject){ if(!super.equals(otherObject)) return false; Manager other=(Manager)otherObject; return bonus==other.bonus; } public int hashCode(){ return super.hashCode()+17*new Double(bonus).hashCode(); } public String toStirng(){return super.toString()+"[bonus="+bonus+"]";} }
test:
package equals; public class EqualTest { public static void main(String[]args){ Employee alice_1=new Employee("Alice Adam",75000,19877,12,15); Employee alice_2=alice_1; Employee alice_3=new Employee("Alice Adams",75000,1987,12,15); Employee bob=new Employee("Bob Brandson",50000,1989,10,1); System.out.println("Alice_1==Alice_2:"+(alice_1==alice_2)); System.out.println("alice_1==alice_3"+(alice_1==alice_3)); System.out.println("alice_1.equals(alice_3)"+alice_1.equals(alice_3)); System.out.println("bob.toString():"+bob); Manager carl=new Manager("Carl Cracker",8000,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("alice_1.hashcode():"+alice_1.hashCode()); System.out.println("alice_3.hashcode():"+alice_3.hashCode()); System.out.println("bob.hashcode():"+bob.hashCode()); System.out.println("carl.hashcode():"+carl.hashCode()); } }