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

今私の質問は、2つの違いは何ですか、どちらの実装が優れているかということです..! 私の完全なポジョは...

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

Eclipse-generatehashCode()は、POJO の小さな変更に関してはより敏感です。たとえば、互いに値を切り替えるjobと、同じ値が返されます (加算は可換です) が、派手な Eclipse バージョンはまったく異なる値を返します。namehashCode()

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

最も重要な違いは、実装がNullPointerExceptionifjobまたはnameisをスローすることですnull

さらに、メソッドeclipseは、より不規則なハッシュコードを生成します。これは、理論的にはハッシュテーブルが縮退してパフォーマンスが低下する可能性が低いことを意味しますが、実際にjava.util.HashMapは、補助ハッシュ関数を使用して以前にハッシュコードをスクランブルするため、おそらく問題にはなりません。それを使用します。

于 2012-04-15T18:09:02.583 に答える