Quelle est la différence entre le `` méthode et la `` méthode ?
Réponses
Trop de publicités?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
.
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 queaStringBuffer.equals(aString)
. Cela nécessiterait l'API Java développeurs de faire certaines spécial de la mise en œuvre des Chaînes dans laequals()
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'unString
,StringBuilder
,StringBuffer
,CharSequence
et toutes les classes dérivées de ces. Si le paramètre est de type Chaîne de caractères, alorsString.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 compareStringBuffer
etStringBuilder
de façon intelligente. Il ne fait pas appel à la lourdetoString()
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-jacentchar[]
tableau, ce qui est excellent!
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,
-
String#contentEquals
va lancer des entrées en phase nationale si l'argument fourni est -null
maisString#equals
sera de retourfalse
-
String#equals
compare le contenu uniquement lorsque l'argument fourni est -instance of String
sinon il sera de retourfalse
dans tous les autres cas, mais d'autre partString#contentEquals
vérifie le contenu de tous les objets qui implémentent l'interfaceCharSequence
. -
Vous pouvez également modifier le code afin qu'
String#contentEquals
retour le mauvais résultat ou un résultat que vous souhaitez en substituantequals
méthode de l'argument passé comme indiqué ci-dessous, mais vous ne pouvez pas faire ces tweaks avecString#equals
.
Ci-dessous le code sera toujours produire de l'true
tant ques
contient toutstring
, qui est de 3 caractèresString 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
sera plus lent, alorsString#Equals
dans le cas lorsque l'argument est fourni est -instance of String
et la longueur des deuxString
est le même, mais le contenu ne sont pas égaux.
Exemple si la chaîne sontString s = "madam"
etString argPassed = "madan"
alorss.contentEquals(argPassed)
prendra presque le double de temps d'exécution, dans ce cas, par rapport à l's.equals(argPassed)
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, alorsString#Equals
dans presque tous les cas possibles.
Un point de plus à ajouter à sa réponse
-
String#contentEquals
d'unString
objet également de comparer leStringBuilder
contenu et donner le résultat au moment de l'String#Equals
sera de retourfalse
-
String
classeequals(Object o)
méthode n'String
comparaison. MaiscontentEquals(CharSequence cs)
des contrôles pour les classes s'étendAbstractStringBuilder
d.StringBuffer
,StringBuilder
etString
classe aussi (Elles sont toutes de typeCharSequence
).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èveraNullPointerException
si l'argument fourni est -null
maisequals()
sera de retour faux car la equals() vérifie instanceOf (if (anObject instance of String)
) qui retourne false si l'argument est -null
.
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);
}
}