Problème java
Résolu
Utilisateur anonyme
-
bouchrot Messages postés 351 Date d'inscription Statut Membre Dernière intervention -
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 ????
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:
- Problème java
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
- Waptrick java voiture - Télécharger - Jeux vidéo
4 réponses
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.
Remarque : il est également fortement conseillé de redéfinir hashCode
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 ?
Elle sert à quoi la méthode hashCode ?
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 :
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]