2010-01-25 5 views
21

Как я должен реализовать hashCode() и equals() для следующего класса в Java?Как реализовать метод hashCode и equals

class Emp 
{ 
    int empid ; // unique across all the departments 
    String name; 
    String dept_name ; 
    String code ; // unique for the department 
} 
+0

Это не исходный код Java. Или вы создали свой собственный класс под названием 'string'? И вы действительно должны взглянуть на это: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html –

+0

Я вижу, что Joachim изменил пару ошибок в вашем примере кода. Тем не менее, я рекомендую посмотреть ссылку, которую я опубликовал в своем предыдущем комментарии. –

+0

Я использую класс строки java – Vidya

ответ

30

в Затмения правой Нажать на мыши> Источник -> генерировать хэш-код() и Equals() дает следующее:

/* (non-Javadoc) 
* @see java.lang.Object#hashCode() 
*/ 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (code == null ? 0 : code.hashCode()); 
    return result; 
} 
/* (non-Javadoc) 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof Emp)) 
     return false; 
    Emp other = (Emp) obj; 
    return code == null ? other.code == null : code.equals(other.code); 
} 

Я выбрал код как уникальное поле

+1

Хммм ... Я бы обычно сравнивал все поля в методе equals(), если у вас действительно есть веская причина не ... –

+1

Итак, если два 'Emp' из разных отделов имеют одинаковый код, они равны? Вам нужно хотя бы добавить 'dept_name' в эту реализацию. –

+0

Я принимаю этот ответ, поскольку у меня есть идея, что нужно сделать.jutky принял код как уникальный идентификатор. – Vidya

0

Если код является уникальным (то есть ваш бизнес ключ), то лучше всего использовать код для равных и хэш-код - это хорошая практика, чтобы индивидуальный ключ бизнеса (код) от объекта с идентификатором (ID).

Вот хороший читать: Hibernate Documentation: Equals and HashCode (справедливо не только для самого Hibernate)

+1

Кажется, он уникален для отдела, поэтому предполагает, что отделы могут использовать один и тот же «код». Во всяком случае, довольно расплывчатый вопрос, если вы спросите меня. –

-1

какие бы значения вы ни выбрали, чтобы определить, совпадают ли два объекта, являются ли значения, которые необходимо использовать для создания хэш-кода.

public boolean equals(Object o) { 

    boolean result = false; 

    if(o instanceof CategoryEnum) { 

     CategoryEnum ce = (CategoryEnum) o; 
     result = ce.toString().equals(name); 

    }  
    return result; 

} 


public int hashCode() 
{ 
    int hash = 6; 
    hash += 32 * name.hashCode(); 
    return hash; 
} 
+2

(нет -1 от меня) Это не совсем так. Совершенно законно использовать подмножество для hashCode (например, код и имя для equals и только код для hashCode). Даже законно использовать постоянный hashCode ('public int hashCode() {return 42;}') - он разрушает производительность хэшированных коллекций (HashMap, HashSet, ...), но они продолжают работать корректно. Так что это лучше, чем недействительный метод hashCode. Единственное правило: если два объекта равны ('a.equals (b)'), они должны иметь одинаковый хэш-код ('a.hashCode() == b.hashCode()'). Если они не равны, хэш-коды могут быть равны. – sfussenegger

-2

equals() and hashcode(), У них много разных мест. equals(), если мы не переопределяем его из Object, это означает, что две переменные указывают на одну и ту же кучу объекта?

public Class Student(){ 
    private int id; 
    private name; 
    public Student(int id,String name){ 
    this.name=name; 
    this.id=id; 
} 

public void main(String[] args){ 
    Student A=new Student(20,'Lily'); 
    Student B=new Student(20,'Lily'); 
    boolean flag=A.equals(B)//flag=flase; 
/* 
*Although they attribute the same, but they are two different objects, they point to  different memory 
*/ 


@Override 
public boolean equals(Object obj) { 


    if (obj == null) { 
    return false; 
    } 
    if (this == obj) { 
    return true; 
    } 

    if (this.getClass() != obj.getClass()) { 
    return false; 
    } 
    Student s=(Student)obj; 
    return new Integer(this.id).equals(new Integer(s.id))&&this.name.equals(s.name); 
    } 

/** 
    *Sometimes even though we Override the equals, but we still can not determine whether the *two objects the same, 
    *In the collection object, such as HashSet, this time we have to Override the hashoCode() 
    */ 

public int hashCode(){ 
    return id + name.hashCode() ; 
} 
3

попробуйте этот код, используйте org.apache.commons.lang3.builder

public int hashCode() { 
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers 
     append(empid). 
     append(name). 
     append(dept_name). 
     append(code). 
     toHashCode(); 
} 

public boolean equals(Object obj) { 

    if (obj == this) 
     return true; 
    if (!(obj instanceof Person)) 
     return false; 

    Emp rhs = (Emp) obj; 
    return new EqualsBuilder(). 
     // if deriving: appendSuper(super.equals(obj)). 
     append(name, rhs.name). 
     isEquals(); 
} 
2

Гуава имеет вспомогательные методы для их создания. Вы указываете, какие поля принимать во внимание, и он будет обрабатывать нули для вас и делать вычисление простых чисел для hashcode.

IDE могут также генерировать их в соответствии с выбранными вами полями.

Преимущество делегирования этого инструмента таким образом, что вы получаете стандартное решение и будете меньше беспокоиться об ошибках и обслуживании разнообразных реализаций, распространяемых по всему вашему проекту.

Вот пример использования Guava и порождена плагин IntelliJ: https://plugins.jetbrains.com/plugin/7244?pr=

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