Was ist der Unterschied zwischen der String#equals
Methode und die String#contentEquals
Methode?
Unterschied zwischen den Methoden String#equals und String#contentEquals
Arathana
BalusC
Das String#equals()
vergleicht nicht nur den Inhalt des Strings, sondern prüft auch, ob das andere Objekt auch eine Instanz von a ist String
. Das String#contentEquals()
vergleicht nur den Inhalt (die Zeichenfolge) und tut es nicht Prüfen Sie, ob das andere Objekt auch eine Instanz von ist String
. Es kann alles sein, solange es eine Implementierung von ist CharSequence
die ua abdeckt String
, StringBuilder
, StringBuffer
, CharBuffer
etc.
-
Also, ist es wie die Betreiber
==
(contentEquals) und===
(gleich) in Javascript?– anestv
23. Dezember 2013 um 19:04 Uhr
-
@anestv In Java ist die
==
Betreiber erlaubt Ihnen nur den Vergleich der Verweise nicht der Inhalt von zwei Objekten.– Stefan
24. Dezember 2013 um 3:36 Uhr
-
@Alex Zur Verdeutlichung dient der Operator == in Java dazu, zu prüfen, ob zwei Objekte auf dieselbe Stelle im Speicher zeigen oder ob zwei primitive Typen (byte, short, int, long, float, double, char, boolean) gleich sind.
– La-comadreja
28. Dezember 2013 um 13:47 Uhr
-
@Stephan, der
==
erwähnt wird nur JavaScript; Es wird nie in Bezug auf Java erwähnt.– Olathe
18. März 2016 um 0:03 Uhr
-
@anestv, es gibt Unterschiede (
==
in JavaScript ist weitaus lockerer alscontentEquals
die zum Beispiel keine Zahlen berührt), aber Sie haben Rechtequals
Überprüfung auf eine genaue Typübereinstimmung mitStrings
(Andere Klassen sind möglicherweise lockerer mit Typen in ihrenequals
Methoden).– Olathe
18. März 2016 um 0:09 Uhr
Martin Courteaux
Um es einfach auszudrücken: String.contentEquals()
ist der schlauere Bruder von String.equals()
weil es in der Umsetzung freier sein kann als String.equals()
.
Es gibt einige Gründe, warum es eine separate gibt String.contentEquals()
Methode. Der wichtigste Grund meiner Meinung nach ist:
- Das
equals
Die Methode muss reflexiv sein. Das bedeutet, dass:x.equals(y) == y.equals(x)
. Dies impliziert dasaString.equals(aStringBuffer)
müßte das gleiche sein wieaStringBuffer.equals(aString)
. Dies würde erfordern, dass die Java-API-Entwickler eine spezielle Implementierung für Strings in der vornehmenequals()
Methode von StringBuffer, StringBuilder und CharSequence. Das wäre ein Durcheinander.
Das ist wo String.contentEquals
kommt herein. Dies ist ein eigenständige Methode das tut nicht müssen, zu … haben befolgen Sie die strengen Anforderungen und Regeln zum Object.equals
. Auf diese Weise können Sie den Sinn von implementieren “gleicher Inhalt” freier. Dadurch können Sie beispielsweise intelligente Vergleiche zwischen einem StringBuffer und einem String durchführen.
Und um zu sagen, was genau der Unterschied ist:
-
String.contentEquals()
kann den Inhalt von a vergleichenString
aStringBuilder
aStringBuffer
aCharSequence
und alle davon abgeleiteten Klassen. Wenn der Parameter vom Typ String ist, dannString.equals()
hingerichtet werden. -
String.equals()
vergleicht nur String-Objekte. Alle anderen Objekttypen werden als ungleich betrachtet. -
String.contentEquals()
vergleichen kannStringBuffer
undStringBuilder
auf intelligente Weise. Es tut nicht ruf die SchwerentoString()
-Methode, die den gesamten Inhalt in ein neues String-Objekt kopiert. Stattdessen wird es mit dem Basiswert verglichenchar[]
Array, das ist großartig.
Diese Antwort wurde bereits von gepostet dbw aber er hat es gelöscht, aber er hatte einige sehr gültige Punkte für den Unterschied beim Vergleich der Ausführungszeit, welche Ausnahmen ausgelöst werden,
Wenn Sie sich den Quellcode ansehen Zeichenkette#gleich und String#InhaltGleich Es ist klar, dass es zwei überschriebene Methoden für gibt String#contentEquals
eine, die nehmen StringBuilder
und andere CharSequence
.
Der Unterschied zwischen ihnen,
String#contentEquals
löst NPE aus, wenn das angegebene Argument istnull
aberString#equals
wird zurückkehrenfalse
String#equals
vergleicht den Inhalt nur, wenn das Argument geliefert wirdinstance of String
sonst geht es zurückfalse
in allen anderen Fällen aber andererseitsString#contentEquals
prüft den Inhalt aller Objekte, die Interface implementierenCharSequence
.-
Sie können den Code auch so anpassen
String#contentEquals
durch Überschreiben das falsche Ergebnis oder das gewünschte Ergebnis zurückgebenequals
Methode des übergebenen Arguments wie unten gezeigt, aber Sie können diese Optimierungen nicht mit vornehmenString#equals
.
Der folgende Code wird immer produzierentrue
so lange wies
enthält irgendwelchestring
die 3 Zeichen lang istString s= new String("abc");// "abc"; System.out.println(s.contentEquals(new CharSequence() { @Override public CharSequence subSequence(int arg0, int arg1) { // TODO Auto-generated method stub return null; } @Override public int length() { // TODO Auto-generated method stub return 0; } @Override public char charAt(int arg0) { // TODO Auto-generated method stub return 0; } @Override public boolean equals(Object obj) { return true; } }));
-
String#contentEquals
wird dann langsamerString#Equals
in dem Fall, wenn Argument geliefert wirdinstance of String
und die Länge von beidenString
ist gleich, aber der Inhalt ist nicht gleich.
Beispiel wenn die Zeichenfolge sindString s = "madam"
undString argPassed = "madan"
danns.contentEquals(argPassed)
wird in diesem Fall im Vergleich zu fast die doppelte Ausführungszeit in Anspruch nehmens.equals(argPassed)
-
Wenn die Inhaltslänge nicht für beide Zeichenfolgen gleich ist, dann funktioniert
String#contentEquals
hat dann bessere leistungString#Equals
in fast allen möglichen Fällen.
Ein weiterer Punkt, der seiner Antwort hinzugefügt werden kann
String#contentEquals
von aString
Objekt wird auch mit vergleichenStringBuilder
Inhalte und liefern dabei das passende ErgebnisString#Equals
wird zurückkehrenfalse
-
@dbw diese Antwort stammt aus der Antwort, die Sie gepostet haben
– Prateek
26. Dezember 2013 um 4:52 Uhr
-
@dbw Außerdem, warum hast du deinen Beitrag überhaupt gelöscht?
– MC Kaiser
19. Dezember 2017 um 7:39 Uhr
Versuchen
-
String
Klasseequals(Object o)
Methode tut nurString
Vergleich. AbercontentEquals(CharSequence cs)
Schecks für Klassen erweitertAbstractStringBuilder
dhStringBuffer
,StringBuilder
undString
Klasse auch (Sie sind alle vom TypCharSequence
).String str = "stackoverflow"; StringBuilder builder = new StringBuilder(str); System.out.println(str.equals(builder)); System.out.println(str.contentEquals(builder));
Ausgang:
false
true
Die Ausgabe von first stmt ist false
Weil builder
ist nicht typ String
Also equals()
kehrt zurück false
aber die contentEquals()
überprüft den Inhalt aller Typen wie StringBuilder
, StringBuffer
, String
und da der Inhalt daher derselbe ist true
.
contentEquals
wird werfenNullPointerException
wenn das gelieferte Argument istnull
aberequals()
gibt false zurück, da equals() auf instanceOf (if (anObject instance of String)
), die false zurückgibt, wenn das Argument istnull
.
Amit Sharma
contentEquals(CharSequence cs)
:
- Ermöglicht die Überprüfung der Gleichheit des angegebenen Zeichenfolgenwerts mit einer beliebigen Implementierungsinstanz der Schnittstelle
java.lang.CharacterSequence
(z.B,CharBuffer
,Segment
,String
,StringBuffer
,StringBuilder
)
equals(Object anObject)
:
- Ermöglicht die Überprüfung der Gleichheit des angegebenen Zeichenfolgenwerts mit einer beliebigen Instanz des Typs
java.lang.String
nur
RTFC 🙂
Da das Lesen der Quelle der beste Weg ist, sie zu verstehen, teile ich die Implementierungen beider Methoden (ab jdk 1.7.0_45).
public boolean contentEquals(CharSequence cs) {
if (value.length != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) {
char v1[] = value;
char v2[] = ((AbstractStringBuilder) cs).getValue();
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
// Argument is a String
if (cs.equals(this))
return true;
// Argument is a generic CharSequence
char v1[] = value;
int i = 0;
int n = value.length;
while (n-- != 0) {
if (v1[i] != cs.charAt(i))
return false;
i++;
}
return true;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Es gibt eine andere Methode von String#contentEquals():
public boolean contentEquals(StringBuffer sb) {
synchronized(sb) {
return contentEquals((CharSequence)sb);
}
}
equals()
und contentEquals()
sind zwei Methoden in String
Klasse, um zwei zu vergleichen strings
und string
mit StringBuffer
.
Die Parameter von contentEquals()
sind StringBuffer
und String(charSequence)
. equals()
wird verwendet, um zwei zu vergleichen strings
und contentEquals()
wird verwendet, um den Inhalt von zu vergleichen String
und StringBuffer
.
Methode contentEquals
und equals
sind
public boolean contentEquals(java.lang.StringBuffer);
public boolean contentEquals(java.lang.CharSequence);
public boolean equals(Object o)
Hier ist ein Code, der beide Methoden beschreibt
public class compareString {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
boolean result1 = str1.equals(str2); // works nice and returns true
System.out.println(" str1.equals(str2) - "+ result1);
boolean result2 = str1.equals(sb1); // works nice and returns false
System.out.println(" str1.equals(sb1) - "+ result2);
boolean result3 = str1.contentEquals(sb1); // works nice and returns true
System.out.println(" str1.contentEquals(sb1) - "+ result3);
boolean result4 = str1.contentEquals(sb2); // works nice and returns false
System.out.println(" str1.contentEquals(sb2) - "+ result4);
boolean result5 = str1.contentEquals(str2); // works nice and returns true
System.out.println(" str1.contentEquals(str2) - "+ result5);
}
}
Ausgabe:
str1.equals(str2) - true
str1.equals(sb1) - false
str1.contentEquals(sb1) - true
str1.contentEquals(sb2) - false
str1.contentEquals(str2) - true
fastcodejava
Das contentEquals()
Methode überprüft, ob der Inhalt zwischen a gleich ist String
, StringBuffer
etc, was eine Art Zeichensequenz ist.