Problème java

Résolu
Utilisateur anonyme -  
bouchrot Messages postés 351 Date d'inscription   Statut Membre Dernière intervention   -
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 ????



A voir également:

4 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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
0
Utilisateur anonyme
 
ahhhh nickel merci j'avais oublié qu'il falait passé un object :) Merci beaucoup

Elle sert à quoi la méthode hashCode ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
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]
0
Utilisateur anonyme
 
ok merci
0
bouchrot Messages postés 351 Date d'inscription   Statut Membre Dernière intervention   6
 
est ce que tu as tous ça dans une seul page
0