[java] comparaison de chaine

comparaison de chaine [java] - Programmation

Marsh Posté le 07-06-2001 à 16:01:25    

le symbole ==
y fait pareil que comparTo() ou il y a une nuance
 
quel intéret, ? est du pareil au même ?

Reply

Marsh Posté le 07-06-2001 à 16:01:25   

Reply

Marsh Posté le 07-06-2001 à 17:53:54    

Pour comparer j'utiliserais plutot la methode .equals() de la classe String ...

Reply

Marsh Posté le 07-06-2001 à 18:02:34    

non...c pas pareil... :D
== compare les references des objets... et compareTo() compare leurs valeurs en indiquant si c < ou > ou egal.
equals() dit juste si les valeurs sont egales ou pas.


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 07-06-2001 à 18:07:24    

fais deux instances de String() et fait les comparaisons et tu verras bien :D

Code :
  1. String s1 = new String("bonjour" );
  2. String s2 = new String("bonjour" );
  3. System.out.println("== " + ((s1==s2) ? "" : "pas" ) + " ok" );
  4. System.out.println("equals " + ((s1.equals(s2)) ? "" : "pas" ) + " ok" );
  5. System.out.println("== " + ((s1.compareTo(s2)==0) ? "" : "pas" ) + " ok" );


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 07-06-2001 à 20:04:41    

wouatouwouatou a écrit a écrit :

fais deux instances de String() et fait les comparaisons et tu verras bien :D

Code :
  1. String s1 = new String("bonjour" );
  2. String s2 = new String("bonjour" );
  3. System.out.println("== " + ((s1==s2) ? "" : "pas" ) + " ok" );
  4. System.out.println("equals " + ((s1.equals(s2)) ? "" : "pas" ) + " ok" );
  5. System.out.println("== " + ((s1.compareTo(s2)==0) ? "" : "pas" ) + " ok" );






Remarquez qu'il est possible que si l'on écrit :

Code :
  1. String s1 = "bonjour";
  2. String s2 = "bonjour";


le code ci-dessus puisse avoir un comportement différent... :crazy:

Reply

Marsh Posté le 07-06-2001 à 23:09:01    

moi j'ai eu l'experience ds un if de faire un s1 == s2 qui me renvoie faux alors que s1 et s2 contiennnent les mm caracteres, avec .equals ca marche.
ouala test

Reply

Marsh Posté le 08-06-2001 à 00:17:41    

c'est wouatouwouatou qui gagne le ponpon!! :D il a raison!!
 
Si tu fais par exemple :  
 
public static String TOTO = "toto";
 
public boolean compare(Sting s) {

Reply

Marsh Posté le 08-06-2001 à 00:20:12    

oops!! :D
donc :  
public boolean compare(Sting s) {  
return (s == TOTO);
}
 
compare(TOTO) donnera true,
mais compare("toto" ) donnera false.
 
et si tu fais String toto=TOTO;
compare(toto) donnera true...
 
Voila...

Reply

Marsh Posté le 08-06-2001 à 00:39:53    

String s1 = "foo";
String s2 = "foo";
 
s1 == s2;
 
si ceci renvoie faux c parce qu'à mon avis il y a ici comparaison entre les adresses des 2 chaines, ainsi s1 == s2 renvoie true uniquement si s1 et s2 désignent le même objet
 
s1.compareTo(s2) permet non seulement de tester l'égalité mais aussi de classer les chaînes dans l'ordre léxicographique, enfin bref pour tester l'égalité de 2 chaines, moi je fais :
 
s1.compareTo(s2) == 0

Reply

Marsh Posté le 08-06-2001 à 00:46:48    

juste un petit detail,
si vous trouvez que le comportement du == est bizare c'est a cause du lazy update :  
en fait, pour optimiser, la jvm ne recopie pas systematiquement les chaines de cara donc si a l'initialisation on a une chaine qui est identique a une autre, la reference de la 2eme pointera vers la 1ere. Faire le test avec == marche donc dans ce cas. Cependant, des qu'on effectue une modif sur une des chaines, la recopie est faite et les deux references deviennent differentes meme si par la suite les chaines de caracteres redevienent identiques.
Bon c'est ptetre pas tres clair mais la conclusion est qu'il faut toujours utiliser le equals pour comparer la valeur et == pour les references (c'est ce qui a ete dit d'ailleurs plus haut :) )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed