186 votes

Différence entre String #equals et méthodes de chaînes #contentEquals

Quelle est la différence entre le `` méthode et la `` méthode ?

206voto

BalusC Points 498232

L' String#equals() non seulement compare la Chaîne du contenu, mais vérifie également si l'autre objet est aussi une instance d'un String. L' String#contentEquals() méthodes compare uniquement le contenu (la séquence de caractères) et de ne pas vérifier si l'autre objet est aussi une instance d' String. Il peut être n'importe quoi tant que c'est une mise en œuvre de l' CharSequence ou une instance d' StringBuffer.

62voto

Martijn Courteaux Points 33836

Pour le mettre facilement: String.contentEquals() est le plus intelligent frère de String.equals(), car il peut être plus libre dans la mise en œuvre de String.equals().

Il ya quelques raisons pour lesquelles il est séparé String.contentEquals() méthode. La raison la plus importante je pense:

  • L' equals méthode doit être réflexive. Cela signifie que: x.equals(y) == y.equals(x). Cela implique qu' aString.equals(aStringBuffer) devrait être le même que aStringBuffer.equals(aString). Cela nécessiterait l'API Java développeurs de faire certaines spécial de la mise en œuvre des Chaînes dans la equals() méthode de StringBuffer, StringBuilder et CharSequence. Ce serait un gâchis.

Donc, et c'est alors String.contentEquals . C'est un autonome méthode que ne pas avoir à suivre les exigences strictes et des règles pour l' Object.equals. De cette façon, vous pouvez mettre en œuvre le sens de "l'égalité de contenu" plus librement. Cela vous permet de faire des comparaisons entre un StringBuffer et une Chaîne de caractères, par exemple.

Et pour dire quoi exactement la différence est là:

  • String.contentEquals() pouvez comparer le contenu d'un String, StringBuilder, StringBuffer, CharSequence et toutes les classes dérivées de ces. Si le paramètre est de type Chaîne de caractères, alors String.equals() exécutée.

  • String.equals() compare uniquement les objets String. Tous les autres types d'objets ne sont pas considérés comme égaux.

  • String.contentEquals() peuvent compare StringBuffer et StringBuilder de façon intelligente. Il ne fait pas appel à la lourde toString() méthode, qui copie l'intégralité du contenu d'un nouvel objet de type String. Au lieu de cela, il compare avec le sous-jacent char[] tableau, ce qui est excellent!

34voto

Prateek Points 1935

Cette réponse a déjà été posté par dbw mais il l'a supprimé, mais il a quelques points très valables pour la différence en comparant le temps d'exécution, quelles sont les exceptions levées,

Si vous regardez le code source de la Chaîne de#égal et String#contentEquals il est clair qu'il y a deux méthodes de remplacement pour String#contentEquals qui prennent StringBuilder et les autres CharSequence.
La différence entre eux,

  1. String#contentEquals va lancer des entrées en phase nationale si l'argument fourni est - null mais String#equals sera de retour false
  2. String#equals compare le contenu uniquement lorsque l'argument fourni est - instance of String sinon il sera de retour false dans tous les autres cas, mais d'autre part String#contentEquals vérifie le contenu de tous les objets qui implémentent l'interface CharSequence.
  3. Vous pouvez également modifier le code afin qu' String#contentEquals retour le mauvais résultat ou un résultat que vous souhaitez en substituant equals méthode de l'argument passé comme indiqué ci-dessous, mais vous ne pouvez pas faire ces tweaks avec String#equals.
    Ci-dessous le code sera toujours produire de l' true tant que s contient tout string , qui est de 3 caractères

        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 sera plus lent, alors String#Equals dans le cas lorsque l'argument est fourni est - instance of String et la longueur des deux String est le même, mais le contenu ne sont pas égaux.
    Exemple si la chaîne sont String s = "madam" et String argPassed = "madan" alors s.contentEquals(argPassed) prendra presque le double de temps d'exécution, dans ce cas, par rapport à l' s.equals(argPassed)

  5. Si la longueur du contenu ne sont pas les mêmes pour les deux les cordes puis la fonction String#contentEquals auront de meilleures performances, alors String#Equals dans presque tous les cas possibles.

Un point de plus à ajouter à sa réponse

  1. String#contentEquals d'un String objet également de comparer le StringBuilder contenu et donner le résultat au moment de l' String#Equals sera de retour false

15voto

Trying Points 4092
  • String classe equals(Object o) méthode n' String comparaison. Mais contentEquals(CharSequence cs) des contrôles pour les classes s'étend AbstractStringBuilder d. StringBuffer, StringBuilder et String classe aussi (Elles sont toutes de type CharSequence).

    String str = "stackoverflow";
    StringBuilder builder = new StringBuilder(str);
    System.out.println(str.equals(builder));
    System.out.println(str.contentEquals(builder));
    

sortie:

false
true

La sortie de la première stmt est - false car builder n'est pas de type String donc equals() retours false mais l' contentEquals() vérifie le contenu de tous les type comme StringBuilder, StringBuffer, String et que le contenu est le même, par conséquent true.

  • contentEquals lèvera NullPointerException si l'argument fourni est - null mais equals() sera de retour faux car la equals() vérifie instanceOf ( if (anObject instance of String) ) qui retourne false si l'argument est - null.

14voto

Amit Sharma Points 1197

contentEquals(CharSequence cs):

  • Vous permet de vérifier l'égalité de la chaîne de valeur, et toute la mise en œuvre de l'instance de l'interface java.lang.CharacterSequence (par exemple, CharBuffer, Segment, String, StringBuffer, StringBuilder )

equals(Object anObject):

  • Vous permet de vérifier l'égalité de la chaîne de valeur, et toute instance de type java.lang.String seulement

RTFC :)

Depuis la lecture de la source est la meilleure façon de le comprendre, je suis le partage de la mise en œuvre des deux méthodes (comme de 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;
 }

Il existe une autre méthode de Chaîne#contentEquals():

public boolean contentEquals(StringBuffer sb) {
    synchronized(sb) {
        return contentEquals((CharSequence)sb);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X