IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Comparer 2 objets simples avec equals() & hashCode()


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 19
    Points
    19
    Par défaut Comparer 2 objets simples avec equals() & hashCode()
    Bonjour,

    Je souhaite comparer 2 objets ( des livres spécifiés par un titre, auteur, isbn).

    J'ai redéfini les méthodes equals et hashCode de la classe Livre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	public boolean equals(Livre livre) {
    		if (titre.equalsIgnoreCase(livre.getTitre())
    				&& auteur.equalsIgnoreCase(livre.getAuteur())
    				&& isbn == livre.getIsbn())
    			return true;
    		else
    			return false;
    	}
     
    	public int hashCode() {
    		return titre.hashCode()+auteur.hashCode()+isbn.hashCode();	
    	}
    Cependant, le code suivant échoue à assertEquals(a,b) (j'utilise JUnit) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    	public void testLivreEquals() {
     
    		Livre a = new Livre("titre","auteur","isbn");
    		Livre b = new Livre("titre","auteur","isbn");
     
    		assertTrue(a.equals(a));
    		assertTrue(b.equals(b));
    		assertTrue(a.equals(b));
    		assertTrue(b.equals(a));
     
    		assertEquals(a,b);
     
    		LinkedList<Livre> c = new LinkedList<Livre>();
     
    		c.add(a);
    		System.out.println(a.hashCode()+" "+b.hashCode());
    		assertTrue(c.contains(b));
     
    	}
    J'ai vérifié et j'ai bien le même hasCode. La seule différence entre les livres est que j'instancie une LinkedList à la construction du Livre. Cependant, je ne comprend pas pourquoi cette différence est prise en compte alors que j'ai réécris equals() et hashcode() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public Livre(String titre, String auteur, String numeroISBN) {
    		this.titre = titre;
    		this.auteur = auteur;
    		this.isbn = numeroISBN;
    		numMedia = compteurMedia++;
    		listeExemplaire = new LinkedList<Exemplaire>();
     
    	}
    Qu'est ce que j'ai oublié ?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 29
    Points : 19
    Points
    19
    Par défaut
    le prototype de equals() et hashCode() doit contenir Object et pas le type de l'objet..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/10/2007, 10h11
  2. Souci pour comparer deux objets avec equals()
    Par xillibit dans le forum Langage
    Réponses: 7
    Dernier message: 30/09/2007, 15h41
  3. Problème comparaison objets avec equals
    Par belkasmi dans le forum Langage
    Réponses: 8
    Dernier message: 01/08/2007, 17h39
  4. comparer deux objets pas si simple ?
    Par StIcK dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2006, 20h55
  5. Réponses: 3
    Dernier message: 28/10/2005, 01h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo