2009-05-08 13 views

Répondre

28

equalsIgnoreCasepeut être beaucoup plus rapide. Par exemple, considérons deux chaînes qui commencent par les mêmes 10 000 caractères - mais l'un d'eux a un caractère supplémentaire à la fin. equalsIgnoreCase peut retourner immédiatement; compareToIgnoreCase doit parcourir jusqu'à la fin de la chaîne pour voir la différence.

Mais généralement j'irais avec celui qui exprime mieux votre intention. Cela fonctionne bien pour la performance aussi: en supposant que j'ai raison de dire que equalsIgnoreCase est au moins aussi rapide que compareToIgnoreCase, cela signifie que vous devriez l'utiliser là où vous le pouvez - si vous avez besoin d'une commande réelle, vous devez utiliser compareToIgnoreCase de toute façon.

+0

@Downvoter: Vous voulez donner une raison? –

+0

equalsIgnoreCase() a des différences cruciales à comparer à ToIgnoreCase(). Pour 1, il teste d'abord l'égalité == avant de voir effectivement si tous les caractères sont identiques. CompareTo fera toujours une comparaison complète des caractères, mais les paramètres régionaux ne seront pas pris en compte. Vous avez donc vraiment besoin de savoir quelle comparaison utiliser, puis de la comparer. –

10

si vous vous inquiétez au sujet des performances ... le mesure

+1

Trop facile! Il doit y avoir un moyen qui gaspille le temps de plus de gens! – Bombe

+0

en effet, très belle réponse ce n'est pas? – dfa

+4

En fait, il est très facile de tirer des conclusions erronées en mesurant, car le résultat dépend beaucoup de ce que vous mesurez. Il est bon d'avoir un aperçu d'abord - voir la réponse de Jon Skeet pour un bon exemple. –

4

regardant la source pour java.lang.String

public boolean equalsIgnoreCase(String anotherString) { 
    return (this == anotherString) ? true : 
      (anotherString != null) && (anotherString.count == count) && 
     regionMatches(true, 0, anotherString, 0, count); 
} 

Alors, avant qu'il regarde le caractère de chaîne réelle par caractère (ce qui arrive aussi d'une manière similaire pour compareToIgnoreCase), equalsIgnoreCase vérifie également pour référence l'identité et la longueur du personnage, ce qui pourrait être beaucoup plus rapide.

+0

Ou il pourrait être une perte de temps lorsque la plupart des chaînes sont différentes :) –

+0

bien sûr, c'est un compromis. Mais ces deux comparaisons sont très rapides, donc vous ne perdez pas grand chose. Et la comparaison de longueur devrait être assez efficace (détecter beaucoup de chaînes différentes très rapidement). – Thilo

Questions connexes