Unterschied zwischen den Methoden String#equals und String#contentEquals

Lesezeit: 7 Minuten

Benutzer-Avatar
Arathana

Was ist der Unterschied zwischen der String#equals Methode und die String#contentEquals Methode?

Benutzer-Avatar
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, CharBufferetc.

  • 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 als contentEqualsdie zum Beispiel keine Zahlen berührt), aber Sie haben Recht equals Überprüfung auf eine genaue Typübereinstimmung mit Strings (Andere Klassen sind möglicherweise lockerer mit Typen in ihren equals Methoden).

    – Olathe

    18. März 2016 um 0:09 Uhr


Benutzer-Avatar
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 das aString.equals(aStringBuffer) müßte das gleiche sein wie aStringBuffer.equals(aString). Dies würde erfordern, dass die Java-API-Entwickler eine spezielle Implementierung für Strings in der vornehmen equals() 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 vergleichen Stringa StringBuildera StringBuffera CharSequence und alle davon abgeleiteten Klassen. Wenn der Parameter vom Typ String ist, dann String.equals() hingerichtet werden.

  • String.equals() vergleicht nur String-Objekte. Alle anderen Objekttypen werden als ungleich betrachtet.

  • String.contentEquals() vergleichen kann StringBuffer und StringBuilder auf intelligente Weise. Es tut nicht ruf die Schweren toString() -Methode, die den gesamten Inhalt in ein neues String-Objekt kopiert. Stattdessen wird es mit dem Basiswert verglichen char[] 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,

  1. String#contentEquals löst NPE aus, wenn das angegebene Argument ist null aber String#equals wird zurückkehren false
  2. String#equals vergleicht den Inhalt nur, wenn das Argument geliefert wird instance of String sonst geht es zurück false in allen anderen Fällen aber andererseits String#contentEquals prüft den Inhalt aller Objekte, die Interface implementieren CharSequence.
  3. Sie können den Code auch so anpassen String#contentEquals durch Überschreiben das falsche Ergebnis oder das gewünschte Ergebnis zurückgeben equals Methode des übergebenen Arguments wie unten gezeigt, aber Sie können diese Optimierungen nicht mit vornehmen String#equals.
    Der folgende Code wird immer produzieren true so lange wie s enthält irgendwelche string die 3 Zeichen lang ist

        String 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;
            }
        }));
    
  4. String#contentEquals wird dann langsamer String#Equals in dem Fall, wenn Argument geliefert wird instance of String und die Länge von beiden String ist gleich, aber der Inhalt ist nicht gleich.
    Beispiel wenn die Zeichenfolge sind String s = "madam" und String argPassed = "madan" dann s.contentEquals(argPassed) wird in diesem Fall im Vergleich zu fast die doppelte Ausführungszeit in Anspruch nehmen s.equals(argPassed)

  5. Wenn die Inhaltslänge nicht für beide Zeichenfolgen gleich ist, dann funktioniert String#contentEquals hat dann bessere leistung String#Equals in fast allen möglichen Fällen.

Ein weiterer Punkt, der seiner Antwort hinzugefügt werden kann

  1. String#contentEquals von a String Objekt wird auch mit vergleichen StringBuilder Inhalte und liefern dabei das passende Ergebnis String#Equals wird zurückkehren false

  • @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

Benutzer-Avatar
Versuchen

  • String Klasse equals(Object o) Methode tut nur String Vergleich. Aber contentEquals(CharSequence cs) Schecks für Klassen erweitert AbstractStringBuilder dh StringBuffer, StringBuilder und String Klasse auch (Sie sind alle vom Typ CharSequence).

    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 werfen NullPointerException wenn das gelieferte Argument ist null aber equals() gibt false zurück, da equals() auf instanceOf ( if (anObject instance of String) ), die false zurückgibt, wenn das Argument ist null.

Benutzer-Avatar
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

Benutzer-Avatar
fastcodejava

Das contentEquals() Methode überprüft, ob der Inhalt zwischen a gleich ist String, StringBufferetc, was eine Art Zeichensequenz ist.

1349940cookie-checkUnterschied zwischen den Methoden String#equals und String#contentEquals

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy