Was ist der Unterschied zwischen der String#equals
Methode und der String#contentEquals
Methode?
152
Was ist der Unterschied zwischen der String#equals
Methode und der String#contentEquals
Methode?
Der String#equals()
vergleicht nicht nur den Inhalt des Strings, sondern prüft auch, ob das andere Objekt ebenfalls eine Instanz von a ist String
. Der String#contentEquals()
vergleicht nur den Inhalt (die Zeichenfolge) und prüft nicht , ob das andere Objekt ebenfalls eine Instanz von ist String
. Es kann alles sein , solange es eine Implementierung ist CharSequence
der deckt ua String
, StringBuilder
, StringBuffer
, CharBuffer
etc.
==
Ist es also wie bei den Operatoren (contentEquals) und===
(equals) in Javascript?==
Operator nur den Vergleich der Referenzen, nicht des Inhalts zweier Objekte.==
erwähnte ist nur JavaScript; Es wird nie in Bezug auf Java erwähnt.==
in JavaScript ist weit lockerer alscontentEquals
, die Zahlen zum Beispiel nicht berühren,), aber Sie haben Recht überequals
eine genaue Art Spiel Überprüfung mitStrings
(anderen Klassen lockerer in ihrer mit Typen sein könntenequals
Methoden) .Einfach ausgedrückt:
String.contentEquals()
ist der klügere Bruder vonString.equals()
, weil es in der Implementierung freier sein kann alsString.equals()
.Es gibt einige Gründe, warum es eine separate
String.contentEquals()
Methode gibt. Der wichtigste Grund, den ich denke, ist:equals
Methode muss reflexiv sein. Das heißt :x.equals(y) == y.equals(x)
. Dies impliziert, dassaString.equals(aStringBuffer)
dies dasselbe sein müsste wieaStringBuffer.equals(aString)
. Dies würde erfordern, dass die Java-API-Entwickler eine spezielle Implementierung für Strings in derequals()
Methode von StringBuffer, StringBuilder und CharSequence vornehmen. Das wäre ein Chaos.Dies ist , wo
String.contentEquals
kommt in. Dies ist eine eigenständige Methode , die sich nicht haben , die strengen Anforderungen und Regeln fürObject.equals
. Auf diese Weise können Sie den Sinn für "gleichen Inhalt" freier implementieren . Auf diese Weise können Sie beispielsweise intelligente Vergleiche zwischen einem StringBuffer und einem String durchführen.Und um genau zu sagen, was der Unterschied ist:
String.contentEquals()
kann den Inhalt von aString
, aStringBuilder
, aStringBuffer
, aCharSequence
und allen abgeleiteten Klassen davon vergleichen. Wenn der Parameter vom Typ String ist, wirdString.equals()
er ausgeführt.String.equals()
vergleicht nur String-Objekte. Alle anderen Objekttypen gelten als ungleich.String.contentEquals()
kann vergleichenStringBuffer
undStringBuilder
auf intelligente Weise. Es wird nicht die schweretoString()
Methode aufgerufen , die den gesamten Inhalt in ein neues String-Objekt kopiert. Stattdessen wird es mit dem zugrunde liegendenchar[]
Array verglichen , was großartig ist.quelle
Diese Antwort wurde bereits von dbw gepostet, aber er hat sie gelöscht, aber er hatte einige sehr gültige Punkte für den Unterschied beim Vergleich der Ausführungszeit, welche Ausnahmen werden ausgelöst,
Wenn Sie sich den Quellcode String # equals und String # contentEquals ansehen , ist klar, dass es zwei überschriebene Methoden für
String#contentEquals
die eineStringBuilder
und die andere gibtCharSequence
.Der Unterschied zwischen ihnen,
String#contentEquals
wird NPE auslösen, wenn das angegebene Argument lautet,null
aberString#equals
zurückgebenfalse
String#equals
vergleicht den Inhalt nur, wenn das angegebene Argumentinstance of String
andernfalls zurückgegeben wird.false
In allen anderen Fällen wirdString#contentEquals
der Inhalt aller Objekte zurückgegeben, die die Schnittstelle implementierenCharSequence
.Sie können den Code auch so anpassen, dass
String#contentEquals
das gewünschte falsche Ergebnis zurückgegeben wird, indem Sie dieequals
Methode des übergebenen Arguments wie unten gezeigt überschreiben. Sie können diese Änderungen jedoch nicht vornehmenString#equals
.Der folgende Code wird immer
true
so lange erzeugt, wie er 3 Zeichens
enthältstring
String#contentEquals
wird langsamer sein alsString#Equals
in dem Fall, in dem das angegebene Argument istinstance of String
und die Länge von beiden gleichString
ist, aber der Inhalt nicht gleich ist.Beispiel , wenn die Zeichenfolge sind
String s = "madam"
undString argPassed = "madan"
danns.contentEquals(argPassed)
werden fast doppelt Ausführungszeit in diesem Fall nehmen im Vergleich zus.equals(argPassed)
Wenn die Inhaltslänge für beide Zeichenfolgen nicht gleich ist, hat die Funktion
String#contentEquals
eine bessere Leistung alsString#Equals
in fast allen möglichen Fällen.Ein weiterer Punkt zu seiner Antwort
String#contentEquals
einesString
Objekts wird auch mit demStringBuilder
Inhalt verglichen und liefert das entsprechende Ergebnis, währendString#Equals
es zurückkehrtfalse
quelle
String
Klassenmethodeequals(Object o)
führt nurString
Vergleiche durch. AbercontentEquals(CharSequence cs)
Prüfungen für die Klassen erstreckt sichAbstractStringBuilder
alsoStringBuffer
,StringBuilder
undString
Klasse auch (Sie sind alle vom TypCharSequence
).Ausgabe:
Der Ausgang des ersten stmt ist ,
false
weilbuilder
nicht der Typ istString
soequals()
kehrtfalse
aber diecontentEquals()
Kontrollen für den Inhalt aller Art wieStringBuilder
,StringBuffer
,String
und wie der Inhalt daher gleich isttrue
.contentEquals
wird werfen,NullPointerException
wenn das angegebene Argument ist,null
aberequals()
false zurückgeben, da equals () nach instanceOf (if (anObject instance of String)
) prüft, das false zurückgibt, wenn das Argument lautetnull
.quelle
contentEquals(CharSequence cs)
::java.lang.CharacterSequence
(zBCharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)equals(Object anObject)
::java.lang.String
nurRTFC :)
Da das Lesen der Quelle der beste Weg ist, sie zu verstehen, teile ich die Implementierungen beider Methoden (ab jdk 1.7.0_45).
Es gibt eine andere Methode für String # contentEquals ():
quelle
equals()
undcontentEquals()
sind zwei Methoden in derString
Klasse, um zweistrings
undstring
mit zu vergleichenStringBuffer
.Die Parameter von
contentEquals()
sindStringBuffer
undString(charSequence)
.equals()
wird verwendet, um zwei zu vergleichen,strings
undcontentEquals()
wird verwendet, um den Inhalt vonString
und zu vergleichenStringBuffer
.Methode
contentEquals
undequals
sindHier ist ein Code, der beide Methoden beschreibt
Ausgabe:
quelle
String # equals nimmt Object als Argument und prüft, ob es sich um eine Instanz des String-Objekts handelt oder nicht. Wenn das Argumentobjekt String Object ist, vergleicht es den Inhalt Zeichen für Zeichen. Es gibt true zurück, falls der Inhalt beider Zeichenfolgenobjekte gleich ist.
String # contentEquals die CharSequence-Schnittstelle als Argument. CharSequence kann auf zwei Arten implementiert werden: mithilfe von i) String-Klasse oder (ii) AbstractStringBuilder (übergeordnete Klasse von StringBuffer, StringBuilder)
In contentEquals () wird die Länge vor jeder Objektinstanzprüfung verglichen. Wenn die Länge gleich ist, wird überprüft, ob das Argumentobjekt eine Instanz von AbstractStringBuilder ist oder nicht. Wenn dies der Fall ist (z. B. StringBuffer oder StringBuilder), wird der Inhalt Zeichen für Zeichen überprüft. Wenn das Argument eine Instanz des String-Objekts ist, wird String # gleich von String # contentEquals aufgerufen.
Kurz gesagt,
String # equals vergleicht den Inhalt zeichenweise, falls das Argument auch String-Objekt ist. Und String # contentEquals vergleicht den Inhalt, falls das Argumentobjekt die CharSequence-Schnittstelle implementiert.
String # contentEquals ist langsamer, wenn wir zwei gleich lange String-Inhalte vergleichen, während String # contentEquals intern String # equals für String-Objekte aufruft.
Wenn wir versuchen, Objekte mit unterschiedlicher Inhaltslänge zu vergleichen (sagen wir "abc" mit "abcd"), ist String # contentEquals schneller als String # gleich. Weil die Länge vor jeder Objektinstanzprüfung verglichen wird.
quelle
Die
contentEquals()
Methode überprüft , ist der Inhalt derselben zwischen aString
,StringBuffer
, usw. , die eine Art von char - Sequenz.quelle
Übrigens ist der historische Grund für den Unterschied, dass String ursprünglich keine Oberklasse hatte, weshalb String.equals () einen String als Argument verwendet. Als CharSequence als Superklasse von String eingeführt wurde, benötigte es einen eigenen Gleichheitstest, der über alle CharSequence-Implementierungen hinweg funktionierte und nicht mit den bereits von String verwendeten equals () kollidierte ... also erhielten wir CharSequence.contentEquals ( ), die von String geerbt wird.
Wenn CharSequence in Java 1.0 vorhanden gewesen wäre, hätten wir wahrscheinlich nur CharSequence.equals () und String würde dies einfach implementieren.
Ah, die Freuden, Sprachen zu entwickeln ...
quelle