Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1092 connectés 

  FORUM HardWare.fr
  Programmation

  [Java] equals() = bizarre

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Java] equals() = bizarre

n°112335
exo_
Posté le 14-03-2002 à 22:42:10  profilanswer
 

J'ai fait un petit programme de test pour vérifier que la méthode contains() d'un hashset fonctionne bien avec une classe que j'ai créé dans laquelle je redéfinis la méthode equals(). Eh bien, ça ne fonctionne pas et je ne comprends pas pourquoi.
 
Voilà le test :
 
class setUnicite {
 
    public static void main(String [] args) {
        Set s = new HashSet();
        String d = new String("toto" );
        Etat e1 = new Etat(d,true,false);
        Etat e2 = new Etat(d,true,false);
        Etat e3 = new Etat("toto",true,false);        
        s.add(e1);
        System.out.println("e1.equals(e1) = " + e1.equals(e1));        
        System.out.println("s.contains(e1) = " + s.contains(e1));
        System.out.println("e1.equals(e2) = " + e1.equals(e2));        
        System.out.println("s.contains(e2) = " + s.contains(e2));
        System.out.println("e1.equals(e3) = " + e1.equals(e3));        
        System.out.println("s.contains(e3) = " + s.contains(e3));
    }
     
}
 
Et voilà le résultat :
 
[root@localhost test]# java setUnicite
e1.equals(e1) = true
s.contains(e1) = true
e1.equals(e2) = true
s.contains(e2) = false
e1.equals(e3) = true
s.contains(e3) = false
 
Et pourtant là où ça devient magique, c'est quand on regarde la specif de contains() :  
 
Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).
 
Alors si quelqu'un a une idée sur le phénomène, merci d'avance.

mood
Publicité
Posté le 14-03-2002 à 22:42:10  profilanswer
 

n°112339
benou
Posté le 14-03-2002 à 22:48:03  profilanswer
 

t'as redéfini le hashcode() ??


---------------
ma vie, mon oeuvre - HomePlayer
n°112350
exo_
Posté le 14-03-2002 à 23:00:30  profilanswer
 

Ok ça vient de là :) En fait, j'avais essayé de la modifier mais j'avais mis hashcode() et non pas hashCode()... Alalala heureusement que personne ne programme des logiciels de gestion du trafic aérien en Java :)
 
Bon est-ce que quelqu'un a une idée pour associer un entier unique à une chaîne de caractère ? J'avais bien pensé à un truc du genre le code ascii de chaque caractère concaténé pour faire un nombre mais ça me parait super lourd comme méthode.

n°112359
benou
Posté le 14-03-2002 à 23:07:57  profilanswer
 

t'as pas besoin de te faire chier avec ca !
la seule condition pour la méthode hashcode c'est qu'elle renvoie la même valeur pour  2 objets dans la méthode renvoie vrai.
 
Pour optimiser les algo de hashage (utiliser par les classes HashMap,etc ..), il faut essayer d'élargir le plus possible la plage de valeur que pourras renvoyer la méthode Hashcode.
 
Un truc tout simple, c'est de renvoyer la somme des hashcode des attributs dont tu teste l'égalité dans le equals. Mais attention, le hashcode peu finir par être assez gourmand avec cette méthode.
 
Tu peux par exemple de renvoyer que le hashcode de ta chaine de caractère. Ce sera nettement suffisant !


---------------
ma vie, mon oeuvre - HomePlayer
n°112361
benou
Posté le 14-03-2002 à 23:10:37  profilanswer
 

exo_ a écrit a écrit :

En fait, j'avais essayé de la modifier mais j'avais mis hashcode() et non pas hashCode()...  




 
y a un truc qui est dommage en Java, c'est que tu ne sois pas obligé de déclarer lorsque tu surcharge une méthode.
un truc du style  
 
public extending int hashcode () { ... }
 
Ca éviterait ce genre d'erreur difficilement visibles


---------------
ma vie, mon oeuvre - HomePlayer
n°112368
exo_
Posté le 14-03-2002 à 23:18:54  profilanswer
 

Ok ça marche si je renvoie le hashcode de ma chaîne. Mais en fait dans ma petite tête, je m'étais dit que : "Deux objets String distincts, même si ils ont la même valeur n'ont pas le même hashcode parce que le hashcode grosso modo c'est la valeur du pointeur (ou plutôt de l'identificateur) de l'instance." Mais apparemment ce n'est pas du tout le cas. Beaucoup merci en tout cas :)

n°112374
benou
Posté le 14-03-2002 à 23:24:02  profilanswer
 

c'est la valeur de base. C'est ce que Object renvoie par défaut, parce qu'il ne sait pas quoi renvoyer d'autre ;)
 
C'est pour ca que dès que tu redéfinies equals, il faut redéfinir hashcode. Sinon ca marche plus ...


---------------
ma vie, mon oeuvre - HomePlayer
n°112624
Gonzoide
Les cochons... dans l'espâââce
Posté le 15-03-2002 à 16:52:28  profilanswer
 

exo_ a écrit a écrit :

Bon est-ce que quelqu'un a une idée pour associer un entier unique à une chaîne de caractère ? J'avais bien pensé à un truc du genre le code ascii de chaque caractère concaténé pour faire un nombre mais ça me parait super lourd comme méthode.  




 
Elle te plait pas, la methode hashCode par defaut de String ? Si tu veux en refaire une similaire, voila son algo:
 
Returns a hashcode for this string. The hashcode for a String object is computed as  
 
 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
 
using int arithmetic, where s[i] is the ith character of the string, n is the length of the string, and ^ indicates exponentiation. (The hash value of the empty string is zero.)

n°112625
darklord
You're welcome
Posté le 15-03-2002 à 16:58:15  profilanswer
 

exo_ a écrit a écrit :

Ok ça vient de là :) En fait, j'avais essayé de la modifier mais j'avais mis hashcode() et non pas hashCode()... Alalala heureusement que personne ne programme des logiciels de gestion du trafic aérien en Java :)




 
D'où tiens tu cette information? Il y a des logiciels de gestion de traffic aérien en Java ... Chez EuroControl nottament ...


---------------
Just because you feel good does not make you right
n°113840
exo_
Posté le 18-03-2002 à 21:05:12  profilanswer
 

Au temps pour moi. Mais est-ce que Java est vraiment fréquemment utilisé pour coder des applications qui touchent à des domaines critiques ? Pour ma part, j'aurais plutôt imaginer que l'on utilisait des vieux machins éprouvés par le temps comme le C ou alors des trucs plus blindés comme Ada.

mood
Publicité
Posté le 18-03-2002 à 21:05:12  profilanswer
 

n°114097
BifaceMcLe​OD
The HighGlandeur
Posté le 19-03-2002 à 13:36:36  profilanswer
 

OK pour Ada plus blindé, mais pour C plus éprouvé, c'est à côté : le problème n'est pas le risque d'erreurs dans les compilateurs, mais dans le code applicatif lui-même, et de ce point de vue, Java est nettement moins risqué que C ou même C++.

n°114100
darklord
You're welcome
Posté le 19-03-2002 à 13:42:11  profilanswer
 

BifaceMcLeOD a écrit a écrit :

OK pour Ada plus blindé, mais pour C plus éprouvé, c'est à côté : le problème n'est pas le risque d'erreurs dans les compilateurs, mais dans le code applicatif lui-même, et de ce point de vue, Java est nettement moins risqué que C ou même C++.  




 
exactement!


---------------
Just because you feel good does not make you right
n°114535
benou
Posté le 19-03-2002 à 23:33:08  profilanswer
 

yes. rien vaut un bon système d'exception.
et pour ca, java et ada sont blindés !!


---------------
ma vie, mon oeuvre - HomePlayer
n°114540
- Renaud -
Posté le 19-03-2002 à 23:38:08  profilanswer
 

BifaceMcLeOD a écrit a écrit :

OK pour Ada plus blindé, mais pour C plus éprouvé, c'est à côté : le problème n'est pas le risque d'erreurs dans les compilateurs, mais dans le code applicatif lui-même, et de ce point de vue, Java est nettement moins risqué que C ou même C++.  




 
Le dormeur vient de se reveiller!!!
 
En intercontrat?

n°114671
darklord
You're welcome
Posté le 20-03-2002 à 09:21:33  profilanswer
 

- Renaud - a écrit a écrit :

 
 
Le dormeur vient de se reveiller!!!
 
En intercontrat?  




 
 
Consultant on the beach? J'ai connu ça aussi  :lol:


---------------
Just because you feel good does not make you right

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [Java] equals() = bizarre

 

Sujets relatifs
Aidez un débutant en Java SVP[JAVA] Creation de classes at runtime...
[java] bean - Attention question con - nerveux passez votre cheminJava - coté serveur, ça donne quoi !?
[JAVA] Comment virer la console[java] Deprecated qqun aurait une def en français ?
[java][jsp][servlet] Pb de perte d'ID de session entre servlet et jsp[JAVA] Recuperation d'un fichier source
[JAVA] truc bizarre pour debutant en applet... 
Plus de sujets relatifs à : [Java] equals() = bizarre


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR