2012-04-15 164 views
0

我有一個POJO,在我所定義的hashCode方法我認爲是的..正確實現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; 

公共類Employee {

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

基於Eclipse的產生hashCode()敏感得多,當談到在你的POJO的微小變化。例如。如果切換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 

又見

+0

嗨,所以請你告訴我我的hashcode()實現有什麼問題。!1 – Neera 2012-04-15 18:06:35

+1

你的版本比Eclipse的版本產生更多(錯誤)散列衝突。 – 2012-04-15 18:13:17

+0

@ user1334074:查看我的更新。基本上希望'hashCode()'應該爲稍微不同的對象返回不同的結果。 – 2012-04-15 18:16:15

2

最重要的區別是,如果您的實現將拋出NullPointerException如果jobnamenull

此外,方法eclipse生成更不規則哈希碼的結果,這在理論上意味着哈希表退化和性能較差的可能性較低,但實際上可能無關緊要,因爲java.util.HashMap使用輔助哈希函數在使用之前擾亂哈希碼。

+0

嗨邁克爾,你能否提供這個類的哈希碼()的正確實現,這將是一個很大的幫助..!提前致謝..! – Neera 2012-04-15 18:10:44

+0

@ user1334074:你爲什麼不使用eclipse生成的那個? – 2012-04-15 18:13:40

+0

嗨Miachel,我正在使用這一個儀式現在,如果你可以請給我提供的hashcode()只是我已經生成,這將是一個很好的幫助..! – Neera 2012-04-15 18:16:06

相關問題