2012-04-15 3 views
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; 
} 

Теперь мой вопрос в том, что какая differnce между ними, что один implemenatation лучше ..! Мой полный 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

Затмение генерировать hashCode() гораздо более чувствительны, когда речь идет о небольших изменениях в вашей POJO , Например. если вы переключитесь job и name значения друг с другом, ваш hashCode() будет возвращать одинаковое значение (сложение коммутативно) в то время как версия фантазии Затмение будет возвращать что-то совершенно другое:

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

+1

Ваша версия генерирует гораздо больше (плохих) хэш-коллизий, чем версия Eclipse. –

+0

@ user1334074: см. Мое обновление. В принципе, желательно, чтобы 'hashCode()' возвращал разные результаты для немного разных объектов. –

2

Самое важное отличие заключается в том, что ваша реализация вызовет NullPointerException, если job или name - null.

Кроме того, способ затмение генерирует результаты в более неправильной, хэш-код, который в теории означает, что существует вероятность того, что нижняя хеш-таблицы и вырождающихся, имеющих низкую производительность, но на практике, что, вероятно, не будет иметь значение, так как java.util.HashMap использует хеш-функцию auxiallary чтобы скрестить хэш-код перед его использованием.

+0

Привет Майкл, не могли бы вы предоставить правильную реализацию хеш-кода() для этого класса, который будет отличной помощью .. !! Заранее спасибо..! – Neera

+0

@ user1334074: Почему бы вам просто не использовать тот, который генерируется затмением? –

+0

Привет, Miachel, я использую этот один ритуал. Теперь, если бы вы могли предоставить мне хэш-код(), я просто сгенерировал, что будет большой помощью .. !! – Neera

Смежные вопросы