0

我有一个 pojo ,其中我自己定义了 hashcode 方法,即..

 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;
    }

} 这里

4

2 回答 2

4

当涉及到 POJO 中的小变化时, Eclipse-generatehashCode()更加敏感。例如,如果您相互切换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

也可以看看

于 2012-04-15T17:59:28.950 回答
2

最重要的区别是您的实现将抛出NullPointerExceptionifjobnameis null

此外,eclipse 生成的方法会导致更不规则的哈希码,这在理论上意味着哈希表退化和性能不佳的可能性较低,但实际上这可能无关紧要,因为java.util.HashMap之前使用辅助哈希函数来打乱哈希码使用它。

于 2012-04-15T18:09:02.583 回答