String.equals() ou String.compareTo()
Plusieurs syntaxes existent pour comparer des objets String
. Mais laquelle faut-il utiliser ?
Tout d’abord, mettons de côté l’opérateur ==
qui compare les références des deux objets pour vérifier s’ils correspondent à la même instance.
La méthode String.equals()
vérifie l’égalité de deux chaînes de caractères. Alors que la méthode String.compareTo()
calcule la différence entre deux chaînes de caractères. Il faut savoir que les deux tests suivants sont équivalents[1] :
String str = "ma chaine";if ( str.equals("mot magic")) {/*...*/}
String str = "ma chaine";if ( str.compareTo("mot magic")==0) {/*...*/}
Laquelle de ces deux méthodes est la plus performante pour vérifier l’égalité ? Il paraît évident que la méthode equals()
doit être plus rapide que la méthode compareTo()
puisque la première doit s’arrêter dès qu’une différence est trouvée alors que la seconde calcule la différence. Or la méthode compareTo()
s’arrête également dès la première différence trouvée.
De plus, dans les anciennes version de Java, la méthode equals()
utilisait la méthode compareTo()
. Depuis elle a été optimisée et effectue ses contrôles elle-même. Par exemple, elle vérifie si les deux objets pointent sur la même instance ou bien si les chaînes de caractères ont la même longueur. Dans ces cas particuliers, la méthode equals()
se révèle nettement plus performante.
Par contre, pour des chaînes de caractères de même longueur et ne pointant pas sur la même instance[2], la méthode compareTo()
donne de bien meilleures performances[3].
Notes
[1] Moyennant quelques préconditions sur le caractère non nul des objets.
[2] Beaucoup d’objets String
pointent sur la même instance contrairement à ce que l’on peut penser.
[3] Les mesures ont été réalisées avec Java 1.4.2 sous un environnement MS Windows.
compareTo part de toute façon avec un avantage sur equals. Il est certain de recevoir des String et n’a donc pas à vérifier le type de l’argument qu’il reçoit. Contrairement à equals qui lui est générique.
Tu as tout à fait raison.
Par contre, tu me fais penser que j’ai oublié de préciser que malgré les meilleures performances obtenues avec la méthode compareTo, il vaut utiliser la méthode equals() lorsque l’on souhaite seulement vérifier une égalité. Ceci permet de maintenir une cohérance syntaxique.
De plus, même si la méthode compareTo offre de meilleurs résultats lors des tests de performances. Les cas où la méthode equals est plus rapide sont plus courant dans la plupart des projets.
Je souhaiterais faire une inégalitée… Pour intégrer une sorte de mot de passe
While(inégalitée entre la valeur de deux string)
{
condition rémanante tantque l’inégalitée n’est pas ressolue
}
suite du programme
…
Si vous comprenez, plus précisement (sans !=) mais avec equals ou compareTo() donnant une inégalitée et sortir de la boucle.
Quelque chose comme ci-dessous ? 🙂
while(!str1.equals(str2)) {
// do some stuff
}
Merci bcp