124 votes

Java Strings: compareTo () vs. equals ()

Lors du test de l'égalité des chaînes de caractères en Java, j'ai toujours utilisé equals() parce que pour moi, cela semble être la méthode la plus naturelle pour. Après tout, son nom en dit déjà ce qu'il est destiné à faire. Cependant, un de mes collègues m'a dit récemment avait été enseigné à l'utilisation compareTo() == 0 au lieu de equals(). C'est contre nature (comme compareTo() est destinée à fournir une commande et pas la comparaison pour l'égalité) et même un peu dangereux (parce que compareTo() == 0 n'implique pas nécessairement l'égalité dans tous les cas, même si je sais qu'il le fait pour les Chaînes de caractères) pour moi.

Il ne savait pas pourquoi il a été enseigné à l'utilisation compareTo() au lieu de equals() pour les cordes, et je pourrais aussi ne pas trouver une raison quelconque. Est-ce vraiment une question de goût personnel, ou est-il une raison pour l'une ou l'autre méthode?

110voto

waxwing Points 10190

Une différence est que "foo".equals((String)null) renvoie false alors que "foo".compareTo((String)null) == 0 lève une exception NullPointerException. Ils ne sont donc pas toujours interchangeables, même pour les chaînes.

35voto

Kaleb Brasee Points 25776

Les 2 principales différences sont les suivantes:

  1. est égal vont prendre n'importe quel Objet en tant que paramètre, mais compareTo ne prendra que des Chaînes de caractères.
  2. équivaut seulement vous dit qu'ils sont égaux ou non, mais compareTo donne des informations sur la façon dont les Chaînes de comparer de manière lexicographique.

J'ai pris un coup d'oeil à la Chaîne de code de classe, et l'algorithme dans compareTo et est égal semble fondamentalement la même. Je crois que son opinion était qu'une question de goût, et je suis d'accord avec vous, si tout ce que vous devez savoir, c'est l'égalité des Chaînes de caractères et non pas que l'on vient d'abord de manière lexicographique, alors je voudrais utiliser égal à égal.

27voto

starblue Points 29696

Lorsque vous comparez pour l'égalité, vous devez utiliser equals (), car il exprime clairement votre intention.

compareTo () présente l'inconvénient supplémentaire de ne fonctionner que sur les objets qui implémentent l'interface Comparable.

Cela s'applique en général, pas seulement pour les chaînes.

20voto

robinr Points 1693

compareTo doit faire plus de travail si les chaînes ont des longueurs différentes. equals peut simplement renvoyer false, tandis que compareTo doit toujours examiner suffisamment de caractères pour trouver l'ordre de tri.

10voto

apurva jadhav Points 51

compareTo() ne s'applique pas seulement à Cordes, mais aussi de tout autre objet, car compareTo<T> prend un argument générique T. La chaîne est l'une des classes qui a mis en œuvre l' compareTo() par la méthode de la mise en œuvre de l' Comparable interface.(compareTo() est une méthode de fo à l'Interface comparable). De sorte que toute la classe est libre d'implémenter l'interface Comparable.

Mais compareTo() donne l'ordre des objets, utilisés habituellement dans le tri des objets dans l'ordre croissant ou décroissant, tandis que equals() ne parler de l'égalité et de dire s'ils sont égaux ou non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X