Problème java

[Résolu/Fermé]
Signaler
-
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
-
Bonjour,

J'ai un gros problème en java, j'ai mon code comme ceci :

Vector<MyString> v = new Vector<MyString>();
MyString a = new MyString("a");
MyString b = new MyString("b");
MyString c = new MyString("c");


v.add(a);v.add(b);v.add(c);

MyString x= new MyString("b");

System.out.println(x.equals(b));

System.out.println(v.contains(x));

et ma classe MyString :

class MyString{
private String s;

public MyString(String s){
this.s=s;
}

public String toString(){
return s;
}

public boolean equals(MyString s2){
if(s == s2.s) return true;
return false;
}
}

J'ai lu dans la javadoc que la méthode contains de Vector utilise la fonction equals des objects c'est pour cela que j'ai overidé la méthode equals

Le problème c'est que le premier system.out.println affiche bien true (logique)
mais le deuxième affiche false..... pourquoi ???

Quelqu'un peut m'aider ????



4 réponses

Messages postés
16373
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 août 2021
2 861
On ne compare pas deux objets String avec == il faut que tu utilises equals
De plus, equals prend un Object en paramètre pas directement MyString.

@Override 
public boolean equals(Object o) 
{ 
    if (o instanceof MyString) 
        return (MyString o).s.equals(this.s); 
    else 
    if (o instanceof String) 
        return (String o).equals(this.s); 
    else
        return false; 
}

Remarque : il est également fortement conseillé de redéfinir hashCode

@Override 
public int hashCode() 
{ 
    return s.hashcode(); 
}
La confiance n'exclut pas le contrôle

ahhhh nickel merci j'avais oublié qu'il falait passé un object :) Merci beaucoup

Elle sert à quoi la méthode hashCode ?
Messages postés
16373
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
4 août 2021
2 861
Je ne sais pas si Vector l'utilise mais les Collection s'en servent tout le temps.

Pour optimiser un petit peu les comparaisons, on regarde en premier la valeur de hashCode, c'est un calcul généralement assez simple sur l'objet qui permet d'avoir une indication sur sa valeur.
Si deux objets sont égaux ils ont le même hashCode, du coup si le hashCode est différent on peut tout de suite dire que les objets sont différents sans appeler la méthode equals (qui est généralement plus lourde en calcul). En fait equals n'est appelé que lorsque les hashCode sont identiques.
C'est une méthode d'autant plus avantageuse si on arrive à stocker le hashCode directement dans l'objet, et à ne recalculer sa valeur que lorsque l'objet change, par exemple pour les String la valeur ne change jamais, donc le hashCode est calculé une seule fois, à sa construction. Comparer deux String revient donc à comparer deux entiers et on n'appelle equals que si ces entiers sont identiques.

Par exemple le hashCode d'un String s, qui possède n caractères, est calculé comme ceci :
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

ok merci
Messages postés
352
Date d'inscription
mercredi 12 octobre 2011
Statut
Membre
Dernière intervention
18 juillet 2020
6
est ce que tu as tous ça dans une seul page