Plusieurs syntaxes existent pour comparer des objets String. Mais lequel faut-il utiliser ?

Tout d’abord, mettons de côté l’opérateur == qui compare si 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 test 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.