J'ai utilisé l' ==
opérateur dans mon programme pour comparer toutes mes chaînes jusqu'à présent. Cependant, j'ai rencontré un bogue, j'en ai changé un à la .equals()
place et cela a corrigé le bogue.
Est ==
mauvais? Quand doit-il et ne doit-il pas être utilisé? Quelle est la différence?
==
cela fonctionne sur les objets: stackoverflow.com/a/19966154/2284641==
fonctionnera une partie du temps, car java a un pool de chaînes, où il essaie de réutiliser les références de mémoire des chaînes couramment utilisées. Mais==
compare que les objets sont égaux, pas les valeurs ... tout.equals()
comme l'utilisation appropriée que vous souhaitez utiliser."12"=="1"+2
est faux (probablement)Réponses:
==
teste l'égalité de référence (s'il s'agit du même objet)..equals()
teste l'égalité des valeurs (qu'elles soient logiquement "égales").Objects.equals () vérifie
null
avant d'appeler.equals()
afin que vous n'ayez pas à le faire (disponible à partir de JDK7, également disponible dans Guava ).Par conséquent, si vous souhaitez tester si deux chaînes ont la même valeur, vous voudrez probablement l'utiliser
Objects.equals()
.Vous voulez presque toujours l' utiliser
Objects.equals()
. Dans la rare situation où vous savez que vous avez affaire à des chaînes internes , vous pouvez utiliser==
.À partir de JLS 3.10.5. Littéraux de chaîne :
Des exemples similaires peuvent également être trouvés dans JLS 3.10.5-1 .
Autres méthodes à considérer
String.equalsIgnoreCase () égalité de valeur qui ignore la casse.
String.contentEquals () compare le contenu de l '
String
avec le contenu de anyCharSequence
(disponible depuis Java 1.5). Vous évite d'avoir à transformer votre StringBuffer, etc. en une chaîne avant de faire la comparaison d'égalité, mais vous laisse la vérification nulle.la source
==
vérifie la valeur d'une variable. Lorsque vous avez un objet, la variable qui référence l'objet a la référence de l'objet comme valeur . Ainsi, vous comparez les références lorsque vous comparez deux variables avec==
. Lorsque vous comparez un type de données primitif tel queint
, c'est toujours le même cas. Une variable de typeint
a l'entier comme valeur. Ainsi, vous comparez les valeurs de deuxint
s en utilisant==
. Siint
est la valeur d'une variable ou d'un nombre magique, peu importe. De plus: Une référence n'est rien d'autre qu'un nombre qui fait référence à la mémoire.==
teste les références d'objet,.equals()
teste les valeurs de chaîne.Parfois, il semble que les
==
valeurs soient comparées, car Java effectue des opérations en arrière-plan pour s'assurer que des chaînes en ligne identiques sont bien le même objet.Par exemple:
Mais attention aux nulls!
==
gèrenull
correctement les chaînes, mais appeler à.equals()
partir d'une chaîne nulle provoquera une exception:Donc, si vous savez que cela
fooString1
peut être nul, dites au lecteur qu'en écrivantLes éléments suivants sont plus courts, mais il est moins évident qu'il vérifie la valeur null:
la source
==
faire des valeurs toujours comparer! (C'est juste que certaines valeurs sont des références!)?.
. Cela se transformeraitnullString1?.equals(nullString2);
en une déclaration entièrement nulle. Cependant, cela n'aide pas si vous avezvalidString?.equals(nullString);
- cela lève toujours une exception.==
compare les références d'objets..equals()
compare les valeurs de chaîne.==
Donne parfois des illusions de comparer les valeurs de chaîne, comme dans les cas suivants:En effet, lorsque vous créez un littéral de chaîne, la machine virtuelle Java recherche d'abord ce littéral dans le pool de chaînes et si elle trouve une correspondance, cette même référence sera donnée à la nouvelle chaîne. Pour cette raison, nous obtenons:
(a == b) ===> vrai
Cependant,
==
échoue dans le cas suivant:Dans ce cas, pour
new String("test")
l'instruction, une nouvelle chaîne sera créée sur le tas, et cette référence sera donnée àb
, doncb
sera donnée une référence sur le tas, pas dans le pool de chaînes.Pointe maintenant
a
vers une chaîne dans le pool de chaînes tandis queb
pointe vers une chaîne sur le tas. Pour cette raison, nous obtenons:if (a == b) ===> false.
Bien qu'il
.equals()
compare toujours une valeur de chaîne, il donne la valeur true dans les deux cas:Donc,
.equals()
c'est toujours mieux.la source
.equals()
méthode de classe d'objets @Jacob compare les instances (références / adresse) où, en tant que.equals()
méthodes de classe String , est remplacée pour comparer le contenu (caractères)String
objets pour économiser l'empreinte mémoire car ilString
est connu pour être immuable (j'espère que je le dis correctement ici). Consultez également stackoverflow.com/questions/3052442/…L'
==
opérateur vérifie si les deux chaînes sont exactement le même objet.La
.equals()
méthode vérifie si les deux chaînes ont la même valeur.la source
Les chaînes en Java sont immuables. Cela signifie que chaque fois que vous essayez de changer / modifier la chaîne, vous obtenez une nouvelle instance. Vous ne pouvez pas modifier la chaîne d'origine. Cela a été fait pour que ces instances de chaîne puissent être mises en cache. Un programme typique contient un grand nombre de références de chaîne et la mise en cache de ces instances peut réduire l'empreinte mémoire et augmenter les performances du programme.
Lorsque vous utilisez l'opérateur == pour la comparaison de chaînes, vous ne comparez pas le contenu de la chaîne, mais comparez en fait l'adresse mémoire. S'ils sont tous les deux égaux, cela retournera vrai et faux sinon. Alors que égal à chaîne compare le contenu de la chaîne.
La question est donc de savoir si toutes les chaînes sont mises en cache dans le système, comment se fait-il
==
que false renvoie alors que equals renvoie true? Eh bien, c'est possible. Si vous créez une nouvelle chaîne commeString str = new String("Testing")
vous finissez par créer une nouvelle chaîne dans le cache même si le cache contient déjà une chaîne ayant le même contenu. Bref"MyString" == new String("MyString")
retournera toujours faux.Java parle également de la fonction intern () qui peut être utilisée sur une chaîne pour en faire une partie du cache et
"MyString" == new String("MyString").intern()
retournera donc true.Remarque: l'opérateur == est beaucoup plus rapide qu'égal simplement parce que vous comparez deux adresses mémoire, mais vous devez vous assurer que le code ne crée pas de nouvelles instances de chaîne dans le code. Sinon, vous rencontrerez des bugs.
la source
Assurez-vous de comprendre pourquoi. C'est parce que la
==
comparaison ne compare que les références; laequals()
méthode effectue une comparaison caractère par caractère du contenu.Lorsque vous appelez new pour
a
etb
, chacun obtient une nouvelle référence qui pointe vers le"foo"
dans la table des chaînes. Les références sont différentes, mais le contenu est le même.la source
Oui, c'est mauvais ...
==
signifie que vos deux références de chaîne sont exactement le même objet. Vous avez peut-être entendu que c'est le cas parce que Java conserve une sorte de table littérale (ce qu'il fait), mais ce n'est pas toujours le cas. Certaines chaînes sont chargées de différentes manières, construites à partir d'autres chaînes, etc., vous ne devez donc jamais supposer que deux chaînes identiques sont stockées au même emplacement.Equals fait la vraie comparaison pour vous.
la source
Oui,
==
c'est mauvais pour comparer des chaînes (tous les objets vraiment, sauf si vous savez qu'ils sont canoniques).==
compare simplement les références d'objets..equals()
tests d'égalité. Pour les cordes, elles seront souvent les mêmes, mais comme vous l'avez découvert, ce n'est pas toujours garanti.la source
Java possède un pool de chaînes sous lequel Java gère l'allocation de mémoire pour les objets String. Voir Pools de chaînes en Java
Lorsque vous vérifiez (comparez) deux objets à l'aide de l'
==
opérateur, il compare l'égalité d'adresse dans le pool de chaînes. Si les deux objets String ont les mêmes références d'adresse, il renvoietrue
, sinonfalse
. Mais si vous souhaitez comparer le contenu de deux objets String, vous devez remplacer laequals
méthode.equals
est en fait la méthode de la classe Object, mais elle est remplacée dans la classe String et une nouvelle définition est donnée qui compare le contenu de l'objet.Mais attention elle respecte le cas de String. Si vous voulez une comparaison insensible à la casse, vous devez opter pour la méthode equalsIgnoreCase de la classe String.
Voyons voir:
la source
equalsIgnoreCase
ce qui pourrait être instructif pour le plus frais.Je suis d'accord avec la réponse des zacherates.
Mais ce que vous pouvez faire, c'est appeler
intern()
vos chaînes non littérales.De l'exemple des zachérates:
Si vous internez l'égalité de chaîne non littérale est
true
:la source
==
la comparaison de chaînes.==
compare les références d'objets en Java , et cela ne fait pas exception pour lesString
objets.Pour comparer le contenu réel des objets (y compris
String
), il faut utiliser laequals
méthode .Si une comparaison de deux
String
objets à l'aide==
s'avère êtretrue
, c'est parce que lesString
objets ont été internés et que la machine virtuelle Java a plusieurs références pointant vers la même instance deString
. Il ne faut pas s'attendre à comparer unString
objet contenant le même contenu qu'un autreString
objet en utilisant==
pour évaluer commetrue
.la source
.equals()
compare les données d'une classe (en supposant que la fonction est implémentée).==
compare les emplacements des pointeurs (emplacement de l'objet en mémoire).==
renvoie true si les deux objets (NOT TALKING ABOUT PRIMITIVES) pointent vers la même instance d'objet..equals()
renvoie vrai si les deux objets contiennent les mêmes donnéesequals()
Versus==
en JavaCela peut vous aider.
la source
==
effectue une vérification d'égalité de référence , si les 2 objets (des chaînes dans ce cas) se réfèrent au même objet dans la mémoire.La
equals()
méthode vérifiera si le contenu ou les états de 2 objets sont identiques.C'est évidemment
==
plus rapide, mais donnera (pourrait) donner de faux résultats dans de nombreux cas si vous voulez juste dire si 2String
s contiennent le même texte.Certainement, l'utilisation de la
equals()
méthode est recommandée.Ne vous inquiétez pas de la performance. Certaines choses à encourager à utiliser
String.equals()
:String.equals()
premiers contrôles d'égalité de référence (à l'aide==
), et si les 2 chaînes sont identiques par référence, aucun calcul supplémentaire n'est effectué!String.equals()
vérifiera ensuite la longueur des chaînes. C'est également une opération rapide car laString
classe stocke la longueur de la chaîne, pas besoin de compter les caractères ou les points de code. Si les longueurs diffèrent, aucune vérification supplémentaire n'est effectuée, nous savons qu'elles ne peuvent pas être égales.En fin de compte, même si nous avons la garantie que les chaînes sont des internes, l'utilisation de la
equals()
méthode n'est toujours pas la surcharge que l'on pourrait penser, certainement la voie recommandée. Si vous voulez une vérification efficace des références, utilisez des énumérations où la spécification et l'implémentation du langage garantissent que la même valeur d'énumération sera le même objet (par référence).la source
Obviously == is faster
- en fait la mise en place des.equals(String)
premiers contrôles==
avant toute autre chose donc je dirais que la vitesse est à peu près identique.public boolean equals(Object anObject) { if (this == anObject) { return true; } ...
Si vous êtes comme moi, lorsque j'ai commencé à utiliser Java, je voulais utiliser l'opérateur "==" pour tester si deux instances de String étaient égales, mais pour le meilleur ou pour le pire, ce n'est pas la bonne façon de le faire en Java.
Dans ce tutoriel, je vais démontrer plusieurs façons différentes de comparer correctement les chaînes Java, en commençant par l'approche que j'utilise la plupart du temps. À la fin de ce didacticiel de comparaison de chaînes Java, je vais également expliquer pourquoi l'opérateur "==" ne fonctionne pas lors de la comparaison de chaînes Java.
Option 1: comparaison de chaînes Java avec la méthode equals La plupart du temps (peut-être 95% du temps), je compare des chaînes avec la méthode equals de la classe Java String, comme ceci:
Cette méthode String equals examine les deux chaînes Java et si elles contiennent exactement la même chaîne de caractères, elles sont considérées comme égales.
En examinant un exemple de comparaison de chaîne rapide avec la méthode equals, si le test suivant était exécuté, les deux chaînes ne seraient pas considérées comme égales car les caractères ne sont pas exactement les mêmes (le cas des caractères est différent):
Mais, lorsque les deux chaînes contiennent exactement la même chaîne de caractères, la méthode equals renvoie true, comme dans cet exemple:
Option 2: comparaison de chaînes avec la méthode equalsIgnoreCase
Dans certains tests de comparaison de chaînes, vous voudrez ignorer si les chaînes sont en majuscules ou en minuscules. Lorsque vous souhaitez tester l'égalité de vos chaînes de cette manière, sans respecter la casse, utilisez la méthode equalsIgnoreCase de la classe String, comme ceci:
Option 3: comparaison de chaînes Java avec la méthode compareTo
Il existe également un troisième moyen, moins courant, de comparer les chaînes Java, et c'est avec la méthode StringThere compareTo. Si les deux chaînes sont exactement identiques, la méthode compareTo retournera une valeur de 0 (zéro). Voici un exemple rapide de ce à quoi ressemble cette approche de comparaison de chaînes:
Pendant que j'écris sur ce concept d'égalité en Java, il est important de noter que le langage Java inclut une méthode d'égalité dans la classe d'objet Java de base. Chaque fois que vous créez vos propres objets et que vous souhaitez fournir un moyen de voir si deux instances de votre objet sont "égales", vous devez remplacer (et implémenter) cette méthode égale dans votre classe (de la même manière que le langage Java fournit ce comportement d'égalité / comparaison dans la méthode String equals).
Vous voudrez peut-être jeter un œil à ceci ==, .equals (), compareTo () et compare ()
la source
Une fonction:
Tester:
la source
==
etequals
a déjà été répondue par d'autres solutions, je viens de proposer une façon différente de comparer les chaînes de manière lâcheL'
==
opérateur vérifie si les deux références pointent vers le même objet ou non..equals()
vérifier le contenu réel de la chaîne (valeur).Notez que la
.equals()
méthode appartient à la classeObject
(super classe de toutes les classes). Vous devez le remplacer selon les exigences de votre classe, mais pour String, il est déjà implémenté et vérifie si deux chaînes ont la même valeur ou non.Cas 1
Raison: les littéraux de chaîne créés sans null sont stockés dans le pool de chaînes dans la zone permgen du tas. Donc, s1 et s2 pointent vers le même objet dans le pool.
Cas 2
Motif: si vous créez un objet String à l'aide du
new
mot clé, un espace distinct lui est alloué sur le tas.la source
==
compare la valeur de référence des objets tandis que laequals()
méthode présente dans lajava.lang.String
classe compare le contenu de l'String
objet (à un autre objet).la source
equals()
méthodeString
est en fait dans laString
classe, pas dansObject
. La valeurequals()
par défaut dansObject
ne comparerait pas que le contenu est le même et, en fait, renvoie juste vrai lorsque la référence est la même.Je pense que lorsque vous définissez un,
String
vous définissez un objet. Vous devez donc utiliser.equals()
. Lorsque vous utilisez des types de données primitifs que vous utilisez==
mais avecString
(et tout objet), vous devez utiliser.equals()
.la source
Si la
equals()
méthode est présente dans lajava.lang.Object
classe, et il est prévu de vérifier l'équivalence de l'état des objets! Cela signifie, le contenu des objets. Alors que l'==
opérateur doit vérifier que les instances d'objet réelles sont identiques ou non.Exemple
Considérons deux variables de référence différentes
str1
etstr2
:Si vous utilisez le
equals()
Vous obtiendrez la sortie comme
TRUE
si vous l'utilisiez==
.Maintenant , vous obtiendrez la
FALSE
en sortie, parce que les deuxstr1
etstr2
pointent à deux objets différents , même si les deux partagent le même contenu de la chaîne. C'est à cause d'new String()
un nouvel objet qui est créé à chaque fois.la source
L'opérateur == est toujours destiné à la comparaison de référence d'objet , tandis que la méthode String class .equals () est remplacée pour la comparaison de contenu :
la source
Tous les objets sont garantis d'avoir une
.equals()
méthode puisque Object contient une méthode.equals()
,, qui retourne un booléen. C'est le travail de la sous-classe de remplacer cette méthode si une définition plus précise est requise. Sans elle (c'est-à-dire en utilisant==
), seules les adresses mémoire sont vérifiées entre deux objets pour l'égalité. La chaîne remplace cette.equals()
méthode et au lieu d'utiliser l'adresse mémoire, elle retourne la comparaison des chaînes au niveau des caractères pour l'égalité.Une note clé est que les chaînes sont stockées dans un pool de blocs, donc une fois qu'une chaîne est créée, elle est stockée pour toujours dans un programme à la même adresse. Les cordes ne changent pas, elles sont immuables. C'est pourquoi c'est une mauvaise idée d'utiliser la concaténation de chaîne régulière si vous avez un sérieux traitement de chaîne à faire. Au lieu de cela, vous utiliseriez les
StringBuilder
classes fournies. N'oubliez pas que les pointeurs de cette chaîne peuvent changer et si vous étiez intéressé de voir si deux pointeurs étaient les mêmes, ce==
serait une bonne façon de procéder. Les cordes elles-mêmes ne le font pas.la source
final String
variables) et les chaînes que votre programme interne explicitement sont stockées dans ce que vous appelez un "pool de blocs". Tous les autresString
objets sont soumis à la récupération de place une fois qu'il n'y a plus de références actives à eux, comme tout autre type d'objet. De plus, bien que l'immuabilité soit nécessaire pour que l'ensemble du mécanisme d'internement fonctionne, cela n'est pas pertinent pour cela.Vous pouvez également utiliser la
compareTo()
méthode pour comparer deux chaînes. Si le résultat compareTo est 0, les deux chaînes sont égales, sinon les chaînes comparées ne sont pas égales.Le
==
compare les références et ne compare pas les chaînes réelles. Si vous avez créé chaque chaîne à l'aide de,new String(somestring).intern()
vous pouvez utiliser l'==
opérateur pour comparer deux chaînes, sinon les méthodes equals () ou compareTo ne peuvent être utilisées.la source
En Java, lorsque l' opérateur "==" est utilisé pour comparer 2 objets, il vérifie si les objets se réfèrent au même endroit en mémoire. En d'autres termes, il vérifie si les 2 noms d'objet sont essentiellement des références au même emplacement mémoire.
La classe Java String remplace en fait l'implémentation equals () par défaut dans la classe Object - et elle remplace la méthode afin qu'elle vérifie uniquement les valeurs des chaînes, pas leurs emplacements en mémoire. Cela signifie que si vous appelez la méthode equals () pour comparer 2 objets String, tant que la séquence réelle de caractères est égale, les deux objets sont considérés comme égaux.
la source