正确实现hashcode()

时间:2012-04-15 17:54:20

标签: java

我有一个pojo,我自己定义了哈希码方法..

 public int hashCode()
     {       
     return name.hashCode()+job.hashCode()+salary;       

 }

但是由于我使用的是eclipse IDE,它还提供了我自动生成的哈希码,它是..

     @Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((job == null) ? 0 : job.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + salary;
    return result;
}

现在我的问题是两者之间的差异是什么,哪一个实现更好......!我完整的pojo是......

enter codepackage CollectionsPrac;

公共类员工{

 String name,job;
 int salary;


 public Employee(String n , String j, int t )
 {
     this.name= n;
     this.job=j;
     this.salary= t;         
 }


 @Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((job == null) ? 0 : job.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    result = prime * result + salary;
    return result;
}


 /*@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Employee other = (Employee) obj;
    if (job == null) {
        if (other.job != null)
            return false;
    } else if (!job.equals(other.job))
        return false;
    if (name == null) {
        if (other.name != null)
            return false;
    } else if (!name.equals(other.name))
        return false;
    if (salary != other.salary)
        return false;
    return true;
}
 */

/* @Override
 public int hashCode()
     {       
     return name.hashCode()+job.hashCode()+salary;       

 }*/

 @Override
    public boolean equals(Object obj) {  
     if (this == obj)  
    {  
        return true;   
    }  
    // make sure o can be cast to this class  
    if (obj == null || obj.getClass() != getClass())  
    {  
        // cannot cast  
        return false;  
    }           

     Employee e = (Employee) obj;   
     return this.name.equals(e.name)&&this.job.equals(e.job)&&this.salary==e.salary;
 }

 @Override
 public String toString() {
        return name+"\t" +"\t"+  job +"\t"+ salary;
    }

}  这里

2 个答案:

答案 0 :(得分:4)

对于POJO中的小变化,Eclipse生成hashCode()更敏感。例如。如果你相互切换jobname值,你的hashCode()将返回相同的值(加法是可交换的),而花哨的Eclipse版本将返回完全不同的值:

System.out.println(new Employee("John", "Blacksmith", 100).hashCode());
System.out.println(new Employee("Blacksmith", "John", 100).hashCode());

//your version of hashCode() produces identical result:
376076563
376076563

//Eclipse version:
-1520263300
926019626

另见

答案 1 :(得分:2)

最重要的区别是,如果NullPointerExceptionjobname,您的实施将会产生null

此外,方法eclipse在更不规则的哈希码中生成结果,理论上这意味着哈希表退化并且性能较差的可能性较低,但实际上这可能无关紧要,因为java.util.HashMap使用了auxiallary哈希函数在使用哈希码之前对其进行加扰。