Cordes de Java: compareTo() vs est égale à()
Lors du test de l'égalité de String
s'en Java, j'ai toujours utilisé equals()
parce que pour moi, cela semble être la méthode la plus naturelle pour elle. 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é à 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'elle le fait pour String
's) pour moi.
Il ne savait pas pourquoi il a été enseigné à l'utilisation compareTo()
au lieu de equals()
pour String
's, 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?
- Strictement parlant à un micro-niveau d'optimisation, que nous ne devrions jamais prématurément de prendre la parole à
.equalsIgnoreCase()
est le plus rapide en comparaison, si c'est approprié, sinon.equals()
est ce que vous voulez.
Vous devez vous connecter pour publier un commentaire.
Une différence, c'est que
"foo".equals((String)null)
retourne false, alors qu'"foo".compareTo((String)null) == 0
déclenche une exception NullPointerException. Donc ils ne sont pas toujours interchangeables, même pour les Chaînes.Lors de la comparaison pour l'égalité, vous devez utiliser
equals()
, parce qu'elle exprime votre intention de façon claire.compareTo()
a l'inconvénient supplémentaire qu'il ne fonctionne que sur les objets qui implémentent l'Comparable
interface.Ceci s'applique en général, et pas seulement pour les Chaînes.
Les 2 principales différences sont les suivantes:
equals
vont prendre n'importe quel Objet en tant que paramètre, maiscompareTo
ne prendra que des Chaînes de caractères.equals
seulement vous dit qu'ils sont égaux ou non, maiscompareTo
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 classe String code, 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
equals
.compareTo
a faire plus de travail si les chaînes sont de différentes longueurs.equals
pouvez simplement retourner false, alors quecompareTo
doit toujours examiner suffisamment de caractères pour trouver l'ordre de tri.compareTo()
ne s'applique pas seulement à Cordes, mais aussi de tout autre objet, carcompareTo<T>
prend un argument génériqueT
. La chaîne est l'une des classes qui a mis en œuvre lecompareTo()
par la méthode de la mise en œuvre de laComparable
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é généralement dans le tri des objets dans l'ordre croissant ou décroissant, tandis queequals()
ne parler de l'égalité et dire s'ils sont égaux ou non.Dans Le Contexte De Chaîne:
compareTo: Compare deux chaînes de caractères de manière lexicographique.
est égal à: Compare cette chaîne à l'objet spécifié.
compareTo compare deux chaînes de caractères par leurs caractères (au même indice) et qui renvoie un entier (positif ou négatif) en conséquence.
Une différence très importante entre compareTo et est égal à:
equals() vérifie si deux objets sont les mêmes ou pas et retourne un booléen.
compareTo() (à partir de l'interface Comparable) renvoie un entier. Il vérifie lequel des deux objets est "moins que", "égal à" ou "supérieure" aux autres. Pas tous les objets peuvent être ordonnés de manière logique, donc un compareTo() la méthode n'est pas toujours logique.
Noter que equals() ne définit pas l'ordre entre les objets, qui compareTo() n'.
Maintenant, je vous conseille de consulter le code source des deux méthodes de conclure que est égal à est préférable par rapport à compareTo qui implique des calculs Mathématiques.
Il semble que les deux méthodes très bien faire la même chose, mais le compareTo() la méthode prend en une Chaîne de caractères, pas un Objet, et ajoute quelques fonctionnalités supplémentaires sur le dessus de la normale de la méthode equals (). Si tout ce qui vous intéresse est l'égalité, alors la méthode equals() est le meilleur choix, tout simplement parce qu'il fait plus de sens à la prochaine programmeur qui prend un coup d'oeil à votre code. La différence de temps entre les deux fonctions différentes qui ne devrait pas, sauf si vous êtes en boucle sur un grand nombre d'éléments. Le compareTo() est vraiment utile lorsque vous avez besoin de savoir l'ordre des Chaînes dans une collection ou lorsque vous avez besoin de connaître la différence de longueur entre les chaînes qui commencent par la même séquence de caractères.
source: http://java.sun.com/javase/6/docs/api/java/lang/String.html
equals()
devrait être la méthode de choix dans le cas de l'OP.À la recherche à la mise en œuvre de
equals()
etcompareTo()
dans java.lang.Chaîne sur grepcode, nous pouvons facilement voir que des égaux est mieux de nous si nous sommes concernés par l'égalité de deux Chaînes:equals()
:et
compareTo()
:Lorsque l'une des chaînes est un préfixe d'autre part, la performance de
compareTo()
est pire car il doit encore déterminer le vocabulaire de la commande alors queequals()
ne vous inquiétez plus et retourne la valeur false immédiatement.À mon avis, nous devrions utiliser ces deux comme ils étaient destinés:
equals()
pour vérifier l'égalité, etcompareTo()
de trouver le lexique de la commande.Il y a certaines choses que vous devez garder à l'esprit tout en substituant compareTo en Java par exemple Compareto doit être cohérente avec d'égal à égal et la soustraction ne doit pas être utilisé pour comparer les champs de type entier, comme ils peuvent déborder. vérifier Les choses à retenir tout en substituant Comparateur en Java pour plus de détails.
Est égal peuvent être plus efficaces que la compareTo.
Si la longueur des séquences de caractères Chaîne de caractères ne correspondent pas, il n'y a aucun moyen de Chaînes sont égales, donc le rejet peut être beaucoup plus rapide.
Si par ailleurs c'est le même objet (l'identité de l'égalité, plutôt que de logique de l'égalité), il sera également plus efficace.
Si ils ont également mis en œuvre hashCode de la mise en cache, il pourrait être encore plus rapide pour rejeter non-égaux dans le cas où leur hashCode ne correspondent pas.
String.equals()
nécessite invoquantinstanceof
opérateur, tandis quecompareTo()
exige pas. Mon collègue a noté de grandes performances déroulante causée par un nombre excessif deinstanceof
appels enequals()
méthode, cependant mon test s'est avérécompareTo()
être légèrement plus rapide.J'ai été en utilisant, cependant, la version 1.6 de Java. Sur les autres versions (ou d'autres JDK vendeurs) la différence pourrait être plus grande.
Test par rapport à chaque à chaque chaîne de 1000 élément tableaux, répété 10 fois.
compareTo()
est plus rapide queequals()
? Mais pour la plupart des ensembles de données du monde réelequals()
est beaucoup plus rapide quecompareTo() == 0
.equals()
brille si les chaînes ont un préfixe commun mais de longueur différente ou si elles sont en fait le même objet.equals
peut prendre n'importe quel Objet en tant que paramètre, maiscompareTo
ne peut que prendre de la Chaîne.quand cometo null,
compareTo
va lancer une exceptionlorsque vous voulez savoir d'où l'diff arriver,vous pouvez utiliser
compareTo
.C'est une expérience dans la nécromancie 🙂
La plupart des réponses de comparer les performances des API et des différences. Ils manquent le point fondamental que les deux opérations n'ont tout simplement des sémantiques différentes.
Votre intuition est correcte. x.equals(y) n'est pas interchangeable avec x.compareTo(y) == 0.
La première compare l'identité, tandis que l'autre compare la notion de "taille". Il est vrai que, dans de nombreux cas, surtout avec les types primitifs, ces deux co-align.
Le cas général est: est-ce
Si x et y sont identiques, ils partagent la même "taille": si x.equals(y) est vrai => x.compareTo(y) est de 0.
Toutefois, si x et y partagent la même taille, cela ne signifie pas qu'ils sont identiques.
si x.compareTo(y) est 0 ne signifie pas nécessairement x.equals(y) est vrai.
Un exemple irrésistible où l'identité diffère de la taille serait de nombres complexes. Supposons que la comparaison est faite par leur valeur absolue. Donc, étant donné deux nombres complexes: Z1 = a1 + b1*i et Z2 = a2 + b2*i:
Z1.equals(z2) renvoie true si et seulement si a1 = a2 et b1 = b2.
Cependant Z1.compareTo(Z2) renvoie 0 pour et le nombre infini de (a1,b1) et (a2,b2) paires tant qu'ils satisfont à la condition a1^2 + b1^2 == a2^2 + b2^2.
equals
:requis pour la vérification de l'égalité et de la restriction des doublons. De nombreuses classes de Java utilisation de la Bibliothèque dans ce cas, ils ont voulu trouver des doublons. par exemple,
HashSet.add(ob1)
ne fera qu'ajouter si ce n'existent pas. Donc, si vous êtes l'extension de certaines classes comme ceci ensuite remplacerequals()
.compareTo
:requis pour la commande de l'élément. De nouveau pour la stabilité de tri vous avez besoin d'égalité, il y a donc un retour 0.
equals() vérifie si les deux chaînes sont égales ou non.Il donne une valeur booléenne.
compareTo() vérifie si une chaîne de caractères de l'objet est égale à la plus ou moins grande à l'autre de la chaîne de l'objet.Il donne comme résultat :
1 si la chaîne de l'objet est plus grand
0 si les deux sont égaux
-1 si la chaîne est plus petite que les autres chaîne de
eq:
Est égal à -
1 - Remplacer la méthode GetHashCode pour permettre à un type à fonctionner correctement dans une table de hachage.
2 - Ne pas jeter une exception dans la mise en œuvre d'une méthode Equals. Au lieu de cela, retourner false pour un argument null.
3-
Invocations successives de x.Equals(y) retourner la même valeur tant que l'objet référencé par x et y ne sont pas modifiés.
4 - Pour certains types d'objets, il est souhaitable de disposer d'Égal à tester l'égalité des valeurs à la place de référentiel de l'égalité. Mise en œuvre d'égal à Égal retourne true si les deux objets ont la même valeur, même si elles ne sont pas de la même instance.
Par Exemple -
De sortie :-
tout compareTo -
Compare la situation actuelle avec un autre objet du même type et retourne un entier qui indique si l'instance actuelle précède, suit, ou se produit dans la même position dans l'ordre de tri que l'autre objet.
Il retourne -
Moins de zéro Cette instance précède obj dans l'ordre de tri. Zéro Cette instance se produit dans la même position dans l'ordre de tri en obj. Supérieure à zéro Cette instance suit obj dans l'ordre de tri.
Il peut jeter ArgumentException si l'objet n'est pas le même type d'instance.
Par exemple, vous pouvez visiter ici.
Je suggère donc de mieux utiliser Équivaut à la place de compareTo.
GetHashCode()
méthode. Voulez-vous direhashCode()
?"est égal à" comparer des objets et retourne true ou false et
"comparer avec" return 0 si c'est vrai ou un numéro de [> 0] ou [< 0] si c'est faux
voici un exemple:
Résultats:
Documentation de Comparer: https://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
Documentation Est Égal À : https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Objet)
Ici, une chose est importante lors de l'utilisation
compareTo()
surequals()
quecompareTo
fonctionne pour les classes qui implémente 'Comparables' interface sinon il va jeter unNullPointerException
.String
classes implémente l'interface Comparable, tandis queStringBuffer
n'est pas d'où vous pouvez utiliser"foo".compareTo("doo")
dansString
objet, mais pas dansStringBuffer
Objet.Je crois d'égal à égal et equalingnorecase méthodes de la Chaîne de retour le vrai et le faux, qui est utile si vous voulez comparer les valeurs de l'objet de type string, Mais dans le cas de la mise en œuvre de compareTo et compareToIgnoreCase méthodes de retours positifs, négatifs et la valeur zéro qui sera utile en cas de tri.