Quelle est la différence entre la String#equals
méthode et la String#contentEquals
méthode?
152
Quelle est la différence entre la String#equals
méthode et la String#contentEquals
méthode?
Le String#equals()
non seulement compare le contenu de la chaîne, mais aussi vérifie si l'autre objet est une instance d'un String
. Le String#contentEquals()
seul compare le contenu (la séquence de caractères) et ne vérifie pas si l'autre objet est également une instance de String
. Il peut être tout aussi longtemps qu'il est une mise en œuvre CharSequence
qui couvre ao String
, StringBuilder
, StringBuffer
, CharBuffer
, etc.
==
(contentEquals) et===
(equals) en javascript?==
opérateur vous permettra uniquement de comparer les références et non le contenu de deux objets.==
mentionné n'est que JavaScript; il n'est jamais mentionné concernant Java.==
en JavaScript, c'est beaucoup plus lâche quecontentEquals
, ce qui ne touchera pas aux nombres, par exemple), mais vous avez raison deequals
vérifier une correspondance de type exacte avecStrings
(d'autres classes peuvent être plus lâches avec des types dans leursequals
méthodes) .Pour le dire facilement:
String.contentEquals()
est le frère le plus intelligent deString.equals()
, car il peut être plus libre dans la mise en œuvre queString.equals()
.Il existe certaines raisons pour lesquelles il existe une
String.contentEquals()
méthode distincte . La raison la plus importante à mon avis est:equals
méthode doit être réflexive. Cela signifie que:x.equals(y) == y.equals(x)
. Cela implique que celaaString.equals(aStringBuffer)
devrait être le même queaStringBuffer.equals(aString)
. Cela nécessiterait que les développeurs d'API Java réalisent également une implémentation spéciale pour Strings dans laequals()
méthode StringBuffer, StringBuilder et CharSequence. Ce serait un gâchis.C'est là
String.contentEquals
qu'intervient. Il s'agit d'une méthode autonome qui n'a pas à suivre les exigences et les règles strictes pourObject.equals
. De cette façon, vous pouvez mettre en œuvre le sens de «contenu égal» plus librement. Cela vous permet de faire des comparaisons intelligentes entre un StringBuffer et un String, par exemple.Et pour dire quelle est exactement la différence:
String.contentEquals()
peut comparer le contenu de aString
, aStringBuilder
, aStringBuffer
, aCharSequence
et toutes les classes dérivées de ceux-ci. Si le paramètre est de type String, alorsString.equals()
soyez exécuté.String.equals()
compare uniquement les objets String. Tous les autres types d'objets sont considérés comme différents.String.contentEquals()
peut comparerStringBuffer
etStringBuilder
de manière intelligente. Il n'appelle pas latoString()
méthode lourde , qui copie tout le contenu dans un nouvel objet String. Au lieu de cela, il se compare auchar[]
tableau sous-jacent , ce qui est excellent.la source
Cette réponse était déjà postée par dbw mais il l'a supprimée mais il avait des points très valables pour la différence en comparant le temps d'exécution, les exceptions levées,
Si vous regardez le code source String # equals et String # contentEquals, il est clair qu'il existe deux méthodes remplacées pour l'
String#contentEquals
une qui prennentStringBuilder
et l'autreCharSequence
.La différence entre eux,
String#contentEquals
lancera NPE si l'argument fourni estnull
maisString#equals
retournerafalse
String#equals
compare le contenu uniquement lorsque l'argument fourni estinstance of String
sinon il retournerafalse
dans tous les autres cas mais par contreString#contentEquals
vérifie le contenu de tous les objets qui implémentent l'interfaceCharSequence
.Vous pouvez également modifier le code pour
String#contentEquals
renvoyer le mauvais résultat ou le résultat souhaité en remplaçant laequals
méthode de l'argument transmis comme indiqué ci-dessous, mais vous ne pouvez pas effectuer ces modifications avecString#equals
.Le code ci-dessous produira toujours
true
tant qu'ils
contient toutstring
ce qui est long de 3 caractèresString#contentEquals
sera plus lent queString#Equals
dans le cas où l'argument fourni estinstance of String
et la longueur des deuxString
est la même mais le contenu n'est pas égal.Exemple si la chaîne est
String s = "madam"
et prendraString argPassed = "madan"
alorss.contentEquals(argPassed)
presque le double du temps d'exécution dans ce cas par rapport às.equals(argPassed)
Si la longueur du contenu n'est pas la même pour les deux chaînes, la fonction
String#contentEquals
aura de meilleures performances queString#Equals
dans presque tous les cas possibles.Encore un point à ajouter à sa réponse
String#contentEquals
d'unString
objet sera également comparé auStringBuilder
contenu et fournira le résultat approprié tandis queString#Equals
retournerafalse
la source
String
Laequals(Object o)
méthode de classe ne fait que laString
comparaison. MaiscontentEquals(CharSequence cs)
vérifie les classes étend,AbstractStringBuilder
c'est -à- direStringBuffer
,StringBuilder
etString
classe aussi (ils sont tous de typeCharSequence
).production:
La sortie de la première stmt est
false
parcebuilder
est pas de typeString
si lesequals()
rendements ,false
mais lescontentEquals()
contrôles pour le contenu de tout type commeStringBuilder
,StringBuffer
,String
et que le contenu est donc mêmetrue
.contentEquals
lanceraNullPointerException
si l'argument fourni estnull
maisequals()
retournera false car equals () vérifie instanceOf (if (anObject instance of String)
) qui retourne false si l'argument estnull
.la source
contentEquals(CharSequence cs)
:java.lang.CharacterSequence
(par exempleCharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)equals(Object anObject)
:java.lang.String
uniquementRTFC :)
Puisque la lecture de la source est la meilleure façon de la comprendre, je partage les implémentations des deux méthodes (à partir de jdk 1.7.0_45)
Il existe une autre méthode de String # contentEquals ():
la source
equals()
et ilcontentEquals()
existe deux méthodes enString
classe pour comparer deuxstrings
etstring
avecStringBuffer
.Les paramètres de
contentEquals()
sontStringBuffer
etString(charSequence)
.equals()
est utilisé pour comparer deuxstrings
etcontentEquals()
est utilisé pour comparer le contenu deString
etStringBuffer
.Méthode
contentEquals
etequals
sontVoici un code qui décrit les deux méthodes
Production:
la source
String # equals prend Object comme argument et vérifie qu'il s'agit d'une instance de l'objet String ou non. Si l'objet argument est String Object, il compare le contenu caractère par caractère. Elle renvoie true si le contenu des deux objets chaîne est le même.
String # contentEquals prend l'interface CharSequence comme argument. CharSequence peut être implémenté de 2 façons - en utilisant i) la classe String ou (ii) AbstractStringBuilder (classe parent de StringBuffer, StringBuilder)
Dans contentEquals (), la longueur est comparée avant toute vérification d'instance d'objet. Si la longueur est la même, alors il vérifie que l'argument est une instance de AbstractStringBuilder ou non. Si tel est le cas (c'est-à-dire StringBuffer ou StringBuilder), le contenu est vérifié caractère par caractère. Si l'argument est une instance de l'objet String, String # est égal à appelé à partir de String # contentEquals.
Donc en bref,
String # equals compare le contenu caractère par caractère si l'argument case est également un objet String. Et String # contentEquals compare le contenu dans le cas où l'objet argument implémente l'interface CharSequence.
String # contentEquals est plus lent si nous comparons deux contenus de chaîne de même longueur que String # contentEquals appelle en interne String # equals pour l'objet String.
Dans le cas où nous essayons de comparer des objets avec une longueur de contenu différente (disons "abc" avec "abcd"), alors String # contentEquals est plus rapide que String # equals. Parce que la longueur est comparée avant toute vérification d'instance d'objet.
la source
Les
contentEquals()
contrôles de procédé est le contenu sont identiques entreString
,StringBuffer
etc qui une sorte de séquence de carbonisation.la source
BTW, la raison historique de la différence est que String n'avait pas à l'origine de superclasse, donc String.equals () prend une String comme argument. Lorsque CharSequence a été introduit comme la superclasse de String, il lui fallait un test d'égalité qui fonctionnait sur toutes les implémentations de CharSequence, et qui n'entrerait pas en conflit avec equals () déjà utilisé par String ... donc nous avons obtenu CharSequence.contentEquals ( ), hérité de String.
Si CharSequence était présent dans Java 1.0, nous n'aurions probablement que CharSequence.equals () et String implémenterait simplement cela.
Ah, les joies de l'évolution des langues ...
la source