2010-01-25 5 views
21

Comment implémenter hashCode() et equals() pour la classe suivante en Java?Comment implémenter hashCode et équivaut à la méthode

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

Ce n'est pas le code source Java. Ou avez-vous créé votre propre classe appelée 'string'? Et vous devriez vraiment jeter un coup d'oeil à ceci: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html –

+0

Je vois que Joachim a changé quelques erreurs dans votre exemple de code. Néanmoins, je recommande de regarder le lien que j'ai posté dans mon précédent commentaire. –

+0

J'utilise la classe String de java – Vidya

Répondre

30

dans Eclipse droite droit- de la souris> source -> générer hashCode() et equals() donne ceci:

/* (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); 
} 

J'ai sélectionné le code comme champ unique

+1

Hmmm ... Je compare habituellement tous les champs de la méthode equals() sauf si vous avez vraiment une bonne raison de ne pas ... –

+1

Donc si deux 'Emp' de différents départements ont le même code, ils sont égaux? Vous devez au moins ajouter le nom de service dans cette implémentation. –

+0

J'accepte cette réponse car j'ai eu l'idée de ce qui doit être fait.jutky a assumé le code comme identifiant unique. – Vidya

0

Si le code est unique (à savoir la clé de votre entreprise), il est préférable d'utiliser uniquement le code pour égaux et hashCode - il est bon de clé de l'entreprise indépendante (code) d'id (id).

est ici une belle lecture: Hibernate Documentation: Equals and HashCode (valable non seulement pour Hibernate lui-même)

+1

Cela semble être unique pour un ministère, ce qui suggère que les ministères peuvent partager le même «code». De toute façon, une question plutôt vague si vous me le demandez. –

-1

Quelle que soit la valeur que vous utilisez en égal pour déterminer si deux objets sont identiques, ce sont les valeurs que vous devez utiliser pour créer un code de hachage.

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

(non -1 de moi) Ce n'est pas complètement vrai. Il est parfaitement légal de n'utiliser qu'un sous-ensemble pour hashCode (par exemple, le code et le nom pour les égales et seulement le code pour hashCode). Il est même légal d'utiliser un hashCode constant ('public int hashCode() {return 42;}') - il ruine les performances des collections hachées (HashMap, HashSet, ...) mais ils continuent à fonctionner correctement. C'est donc mieux qu'une méthode hashCode invalide. La seule règle est la suivante: si deux objets sont égaux ('a.equals (b)'), ils doivent avoir le même code de hachage ('a.hashCode() == b.hashCode()'). S'ils ne sont pas égaux, les codes de hachage peuvent toujours être égaux. – sfussenegger

-2

est égal à() et hashcode(), Ils ont beaucoup d'endroits différents. est égal à(), si nous ne le remplaçons pas par Object, cela signifie que deux variables pointent vers le même segment d'objet.

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

essayer ce code, utilisez 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

Goyave a des méthodes d'aide pour les créer. Vous lui indiquez les champs à prendre en compte et il gérera les valeurs nulles pour vous et effectuera le calcul du nombre premier pour le hashcode.

Les IDE peuvent également les générer en fonction des champs que vous choisissez. L'avantage de le déléguer à un tel outil est d'obtenir une solution standard et de se soucier moins des bogues et de la maintenance de diverses implémentations réparties sur tout votre projet.

Voici un exemple d'utilisation de goyave et généré par un plugin IntelliJ: https://plugins.jetbrains.com/plugin/7244?pr=

Questions connexes