Quelle est la différence entre == et equals() en Java?
Je tenais à préciser que si je comprends bien:
==
-> est une référence de comparaison, c'est à dire à la fois des objets pointent vers le même emplacement de mémoire.equals()
-> correspond à la comparaison des valeurs dans les objets
Ai-je raison de ma compréhension ?
- ouais, à peu près
- Oui, sur place. Vous pouvez penser
.equals()
comme véritablement équivalent - Double Possible de Comment puis-je comparer les chaînes de caractères en Java?
- Une phrase comme "les deux objets pointent vers le même emplacement de mémoire" n'est pas propre langue, ce qui peut rendre la compréhension plus difficile. Vous voulez dire: "les deux variables font référence au même objet". Notez qu'une variable n'est pas un objet, une variable est une référence à un objet. Les objets ne sont pas "point" de quoi que ce soit.
Vous devez vous connecter pour publier un commentaire.
En général, la réponse à votre question est "oui", mais...
.equals(...)
ne comparer ce qu'il est écrit pour comparer, pas plus, pas moins.equals(Object o)
méthode du plus proche parent de la classe qui a remplacé cette méthode.Object#equals(Object o)
méthode. Par l'Objet de l'API est la même que==
; en effet, elle renvoie true si et seulement si les deux variables font référence au même objet, si leurs références sont un et le même. Ainsi, vous serez en test pour objet d'égalité et pas fonctionnelle de l'égalité.hashCode
si vous remplacezequals
afin de ne pas "casser le contrat". Comme par l'API, le résultat renvoyé à partir de lahashCode()
méthode pour les deux objets doit être la même si leurequals
méthodes montrent qu'ils sont équivalents. L'inverse est pas nécessairement vrai.==
vérifie la mémoire de référence alors pourquoi suis-je ce comportement étrange dans [ce][1][1]: docs.google.com/document/d/... je m'attendais à la sortie pour être vrai. pouvez effacer mon confusionsThe equals method for class Object implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).
<br/>Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
(docs.oracle.com/javase/7/docs/api/java/lang/...)À l'égard de la classe String:
La equals() méthode compare la "valeur" à l'intérieur des instances de Chaîne (sur le tas) que si l'objet de deux références se rapportent à la même instance de Chaîne ou pas. Si les deux références d'objet de type String, reportez-vous à la même instance de Chaîne, puis une grande! Si l'objet de deux références se rapportent à deux différentes instances de Chaîne .. il ne fait pas de différence. Sa "valeur" (ce qui est: le contenu du tableau de caractères) à l'intérieur de chaque instance de Chaîne qui est comparé.
D'autre part, le "==" opérateur compare la valeur de deux références d'objet pour voir si elles se réfèrent à la même instance de Chaîne. Si la valeur des deux références de l'objet "voir" la même instance de Chaîne, le résultat de l'expression booléenne serait "vrai"..duh. Si, d'autre part, la valeur des deux références de l'objet "consultez" différentes instances de Chaîne (même si les deux instances de Chaîne ont les mêmes "valeurs", qui est, le contenu des tableaux de caractères de chaque instance de Chaîne sont les mêmes), le résultat de l'expression booléenne serait "faux".
Comme avec n'importe quelle explication, le laisser pénétrer dans.
J'espère que cela efface un peu les choses.
String
s,==
de référence est égale ainsi, oui, mais généralement fonctionne (comme dans les deuxString
s avec le même contenu généralement être==
les uns aux autres), en raison de la façon dont Java gèreString
s. Il ne sera pas toujours, et c'est certainement une mauvaise pratique, mais c'est une erreur commune, en particulier de personnes en provenance d'autres langues.String
construire à partir d'un littéral de chaîne sera ajoutée à quelque chose appelé leString constant pool
, par exempleString s1 = "someString"; String s2 = "someString;"
les deuxs1
&s2
partagent la même référence.s1 == s2
retournera true. Mais s'ils ont été construits par laString constructor
, par exempleString s1 = new String("someString"); String s2 = new String("someString");
alors de ne pas partager la même référence.s1 == s2
retournera false.Il y a quelques petites différences selon que l'on parle de "primitives" ou "Types d'Objet"; la même chose peut être dit que si vous parlez de la "statique" ou "non-statique" membres; vous pouvez également mélanger tous les ci-dessus...
Voici un exemple (vous pouvez l'exécuter):
Vous pouvez comparer les explications de "==" (Opérateur d'Égalité) et ".est égal à(...)" (méthode en java.lang.La classe d'objet) par le biais de ces liens:
La différence entre == et est égal à confondre moi pendant un certain temps jusqu'à ce que j'ai décidé de regarder de plus près à elle.
Beaucoup d'entre eux disent que pour la comparaison de chaîne de caractères, vous devez utiliser
equals
et pas==
. De l'espoir dans cette réponse, je vais être en mesure de dire la différence.La meilleure façon de répondre à cette question en posant quelques questions à vous-même. donc, nous allons commencer:
Ce qui est de la sortie pour le programme ci-dessous:
si vous le dites,
Je dire que vous êtes droit mais pourquoi avez-vous dit que?
et Si vous dites la sortie est,
Je dire que vous êtes mal mais je vais quand même vous demander pourquoi vous pensez que c'est vrai?
Ok, nous allons essayer de répondre à ça:
Ce qui est de la sortie pour le programme ci-dessous:
Maintenant, Si vous le dites,
Je dire que vous êtes mal mais pourquoi est-ce mal maintenant?
le bon de sortie de ce programme est
Veuillez comparer le programme ci-dessus et essayez de penser à elle.
Ok. Maintenant, cela peut vous aider (merci de lire ceci : imprimer l'adresse de l'objet - pas possible, mais encore nous pouvons l'utiliser).
pouvez-vous juste essayer de penser à la sortie de la dernière de trois lignes dans le code ci-dessus:
pour moi ideone imprimé ce (vous pouvez vérifier le code ici):
Oh! Maintenant vous pouvez voir la identityHashCode(mangue) est égal à identityHashCode(mango2), Mais il n'est pas égal à identityHashCode(mango3)
Même si toutes les variables de chaîne de caractères - mangue, mango2 et mango3 - ont la même valeur, qui est "mango",
identityHashCode()
est toujours pas la même pour tous.Maintenant, essayez de décommenter cette ligne
//mango2 = "mang";
et l'exécuter à nouveau cette fois vous voir tous les troisidentityHashCode()
sont différents.Hmm c'est un conseil utile
nous savons que si
hashcode(x)=N
ethashcode(y)=N
=>x is equal to y
Je ne suis pas sûr de savoir comment java fonctionne en interne, mais je suppose que c'est ce qui s'est passé quand j'ai dit:
java créé une chaîne
"mango"
qui a été relevé(de référence) par la variablemango
quelque chose comme celaMaintenant dans la ligne suivante, quand j'ai dit:
Il effectivement réutilisé la même chaîne
"mango"
qui ressemble à quelque chose comme ceciÀ la fois à la mangue et mango2 pointant vers la même référence
Maintenant, quand j'ai dit
Elle a effectivement créé un tout nouveau référence(chaîne) pour le "mango". qui ressemble à quelque chose comme ceci,
et c'est pourquoi quand j'ai mis les valeurs pour
mango == mango2
, il a mis horstrue
. et quand j'ai mis la valeur pourmango3 == mango2
, il a mis horsfalse
(même si les valeurs étaient les mêmes).et quand vous décommenté la ligne
//mango2 = "mang";
Il a vraiment créé une chaîne de caractères "mang" qui s'est avéré notre graphique comme ceci:
C'est pourquoi le identityHashCode n'est pas la même pour tous.
Espère que cela vous aide à vous les gars.
En fait, je voulais générer un cas de test où == échoue et equals() col.
N'hésitez pas à commenter et laissez-moi savoir Si je me trompe.
mango == mango2
se produire parce que vous n'avez pas créermango2
comme un nouvel objet de type String, et, au lieu de simplement directement référencé"mango"
?Cheers 🙂
Vous devrez remplacer la est égale à la fonction (avec d'autres) pour l'utiliser avec des classes personnalisées.
La méthode equals compare les objets.
La
==
opérateur binaire compare les adresses mémoire.Les deux == et .equals() fait référence à l'objet même si vous ne la supplante pas .equals().
Son votre souhait que vous voulez faire une fois que vous remplacez .equals(). Vous pouvez comparer l'invocation de l'objet d'état avec le passé dans l'objet de l'état ou vous pouvez les appeler super.equals()
Rappelez-vous juste que
.equals(...)
doit être mise en œuvre par la classe, vous êtes en train de comparer. Sinon, il n'y a pas beaucoup d'un point; la version de la méthode pour la classe d'Objet est le même que l'opération de comparaison: Objet#égal.Le seul moment où vous voulez vraiment utiliser l'opérateur de comparaison pour les objets est wen vous comparez les Énumérations. C'est parce qu'il n'existe qu'une seule instance d'une valeur d'énumération à la fois. Par exemple, étant donné l'enum
Vous n'aurez jamais plus d'une instance de
A
à la fois, et de même pourB
etC
. Cela signifie que vous pouvez réellement écrire une méthode comme suit:Et vous n'aurez aucun problème que ce soit.
==
est un opérateur etequals()
est un méthode.Opérateurs sont généralement utilisés pour les primitive type de comparaisons et donc
==
est utilisé pour l'adresse mémoire de comparaison et deequals()
méthode est utilisé pour comparer les objets.L'opérateur==:
L' == est un opérateur relationnel en Java qui est utilisé pour comparer deux opérandes. Il est utilisé pour déterminer si les deux opérandes sont égaux ou non. À l'aide de l'opérateur==, vous pouvez comparer n'importe quel type primitif tel que int, char, float et les Booléens. Après comparaison, l'opérateur == renvoie une valeur booléenne. Si les deux opérandes sont égaux, l'opérateur == renvoie la valeur true. Cependant, si les deux opérandes ne sont pas égaux, il renvoie une valeur false.
Lorsqu'il est utilisé avec des objets, l'opérateur == compare les deux références de l'objet et détermine si elles se réfèrent à la même instance.
L' .Méthode equals ()
equals() est une méthode de la classe String qui est utilisé pour comparer deux chaînes de caractères et de déterminer si elles sont égales. Cette méthode renvoie une valeur booléenne comme un résultat de la comparaison. Si les deux chaînes contiennent les mêmes caractères dans le même ordre, la méthode equals() renvoie la valeur true. Sinon, elle renvoie la valeur false.
Également noter que
.equals()
contient normalement==
pour le test car c'est la première chose que vous souhaitez tester si vous voulais tester si deux objets sont égaux.Et
==
en fait ne regarde valeurs pour les types primitifs, pour les objets, il vérifie la référence.Lorsque vous évaluez le code, il est très clair que (==) compare en fonction de l'adresse de mémoire, tandis que equals(Object o) compare hashCode() de la instances.
C'est pourquoi il est dit de ne pas rompre le contrat entre equals() et hashCode() si vous n'avez pas face à des surprises plus tard.
La principale différence entre == et equals() est
1) == est utilisé pour comparer les primitives.
Par exemple :
2) equals() est utilisée pour comparer des objets.
Par exemple :
==
peut être utilisé dans de nombreux types d'objets, mais vous pouvez utiliserObject.equals
pour tout type , en particulier les Chaînes et Google Marqueurs de Carte.== opérateur de référence est comparé. Mais dans le cas de
il repose sur la mise en œuvre si nous sommes écrasés méthode equals qu'il compare l'objet sur la base de la mise en œuvre donnés dans la méthode redéfinie.
dans le code ci-dessus à la fois obj et obj1 objet contient les mêmes données, mais la référence n'est pas la même sorte de retour est égal à false et == aussi.
mais si nous avons remplacé méthode equals que
sais découvrez ce sera le retour de true et false pour les mêmes cas seulement nous avons remplacé
- il en comparaison de l'objet sur la base de contenu(id) de l'objet
toujours comparer les références de l'objet.
----Sortie-----
vrai
faux
vrai
Il peut être utile d'ajouter que pour les objets wrappers pour les types primitifs - à-d. Int, Long, Double - == retourne true si les deux valeurs sont égales.
De contraste, de mettre les deux Longs en deux ArrayLists, est égal voit comme le même, mais == ne fonctionne pas.
Long a = 128l; Long b = 128l; System.out.println(a == b);
Ici est un général de pouce de la règle de la différence entre
relational operator ==
etthe method .equals()
.object1 == object2
compare si les objets référencés par l'objet1 et objet2 voir til a même emplacement de mémoire dans le Tas.object1.equals(object2)
compare les valeurs de l'objet1 et objet2, peu importe où ils sont situés dans la mémoire.Ceci peut être illustré à l'aide de la Chaîne de
Scénario 1
Scénario 2
Cette chaîne de comparaison pourrait être utilisé comme une base pour la comparaison d'autres types d'objets.
Par exemple si j'ai une Personne de la classe, j'ai besoin de définir la critères de base sur lesquels je vais comparer les deux personnes. Disons que cette personne de la classe a les variables d'instance de la taille et du poids.
Afin de créer les objets de la personne
person1 and person2
et pour comparer ces deux à l'aide de la.equals()
j'ai besoin de remplacer la méthode equals de la classe personne de définir, sur la base desquelles les variables d'instance(hauteur ou le poids), la comparaison sera.Cependant, la
== operator will still return results based on the memory location of the two objects(person1 and person2)
.Pour la facilité de la généralisation de cette personne objet de la comparaison, j'ai créé la suite de la classe de test. L'expérimentation sur ces concepts mettent en évidence des tonnes de faits.
Résultat de cette classe d'exécution est:
La Chaîne de piscine (aka stage) et Entier piscine flou de la différence en outre, il peut vous permettre d'utiliser
==
pour les objets, dans certains cas, au lieu de.equals
Cela peut vous donner une plus grande performance (?), au prix d'une plus grande complexité.
E. g.:
Complexité compromis: ce qui suit peut vous surprendre:
Je vous conseille de rester loin de ces micro-optimisation, et toujours utilisation
.equals
pour les objets, et==
pour les primitives:Fondamentalement,
==
compare si deux objets ont la même référence sur le tas, donc à moins de deux références sont liés à un même objet, cette comparaison sera fausse.equals()
est une méthode héritée deObject
classe. Cette méthode par défaut compare si deux objets ont la même referece. Cela signifie:object1.equals(object2)
<=>object1 == object2
Cependant, si vous souhaitez établir l'égalité entre les deux objets de la même classe que vous devez remplacer cette méthode. Il est également très important de substituer la méthode
hashCode()
si vous avez remplacéequals()
.Mettre en œuvre
hashCode()
lors de l'établissement de l'égalité est une partie de l'Objet Java Contrat. Si vous travaillez avec des collections, et vous n'avez pas mis en œuvrehashCode()
, Étrange, de Mauvaises Choses peuvent se produire:null
sera imprimé après l'exécution du code précédent si vous n'avez pas mis en œuvrehashCode()
.Depuis Java ne supporte pas la surcharge d'opérateur, == se comporte à l'identique
pour chaque objet, mais equals() est une méthode, qui peut être remplacée dans les
Java et de la logique de comparer les objets peuvent être modifiés en fonction de l'entreprise
des règles.
Principale différence entre == et égaux en Java, c'est que "==" est utilisé pour
comparer les primitives tandis que la méthode equals() est recommandé de vérifier
l'égalité des objets.
Comparaison de chaînes de caractères est un scénario courant d'utiliser à la fois == et la méthode equals. Depuis java.lang.Classe String remplacer méthode equals, Il
retourne true si les deux chaînes de caractères de l'objet contient le même contenu, mais == les
seulement retourner true si les deux références pointent vers le même objet.
Voici un exemple de la comparaison de deux Chaînes de caractères en Java pour l'égalité à l'aide de == et de la méthode equals() qui permettra d'éclaircir quelques doutes:
En bref, la réponse est "Oui".
En Java, le
==
opérateur compare les deux objets pour voir s'ils pointent vers le même emplacement de mémoire; tandis que le.equals()
méthode réellement compare les deux objets pour voir si elles ont la même valeur de l'objet.