quelle est la différence entre l'opérateur == et equals()? (avec hashcode() ???)
J'apprenais hashcode plus en profondeur, et pensé que:
1. Si vous remplacez equals(), il est nécessaire de redéfinir hashcode ().
2. Pour savoir si 2 objets sont même objet, utilisez l'opérateur = =
Compte tenu de ces 2 facteurs, en Java, j'ai été en supposant que lorsque == operator
est utilisé pour comparer les si 2 cas sont identiques ou non,
if(object1 == object2)
est en train de faire
if(object1.hashcode() == object2.hashcode())
Mais il semble que je me suis trompé en exécutant le test ci-dessous.
public class Main {
public static void main(String[] args){
Obj1 one = new Obj1();
Obj1 two = new Obj1();
//is this calling hashCode() in backend???
if(one == two) {
System.out.println("same");
}
else {
System.out.println("nope");
}
//this is of course return true
if(one == one) {
System.out.println("one and one is same");
}
}
}
class Obj1 {
@Override
public int hashCode() {
System.out.println("hashCode() is called");
return 111;
}
@Override
public boolean equals(Object another) {
System.out.println("equals() is called");
return false;
}
}
Selon le test qui utilise == operator
et voir si equals()
est appelée et qu'il ne l'était pas.
Donc ma question est si == operator
peut être utilisé pour comparer, si l'objet est le même ou pas, ce qui est le point de l'annulation de la equals()
et hashCode()
méthode de comparaison? N'est-ce pas == operator
faire le travail déjà?
référence:
Primordial hashCode() - est-ce bien suffisant?
http://mindprod.com/jgloss/hashcode.html
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals(java.lang.Objet)
OriginalL'auteur masato-san | 2010-12-22
Vous devez vous connecter pour publier un commentaire.
l'opérateur == détermine si les 2 références pointent vers le même objet.
Donc
l'Objet.méthode equals() est "comment puis-je déterminer si 2 les références à des objets, qui ne sont pas le même objet, sont égaux?"
Si deux références pointent vers le même objet, à la fois
doit être vrai.
Mais si o1 et o2 sont pas le même objet, ils ont encore pourrait être égal logiquement. Pour toute classe donnée, est égal dépend de la sémantique derrière l'objet. Par exemple, considérons une classe où champ1 et champ2 sont définies par l'utilisateur, mais field3 est calculé et un élément aléatoire pour son calcul. Il pourrait être judicieux de définir une égale dans ce cas à ne dépendent champ1 et champ2, et pas champ3. C'est pourquoi égale est nécessaire.
hashcode est utilisé par les différents hachage en fonction des collections, comme HashSets. Il est de votre décision quant à l'utilisation hashcode dans d'égal à égal, mais sachez qu'il n'est pas toujours le cas que si les 2 objets retour le même hashcode, ils sont égaux. Je ne le ferais pas.
OriginalL'auteur hvgotcodes
==
est l'identité..equals()
est l'égalité..equals()
par défaut en utilisant simplement==
(tout commehashCode()
par défautSystem.identityHashCode()
mais vous pouvez les remplacer si il y a une manière plus significative pour vérifier l'égalité. Généralement c'est une sorte de "structurelles" de l'égalité. ie: ce sont tous les morceaux dethis
.equal()
à toutes les pièces dethat
?OriginalL'auteur Laurence Gonsalves
Si vous ne possédez pas déjà une copie; acheter une copie de Efficace Java par Joshua Bloch.
C'est, de facto, de référence pour les développeurs Java et a beaucoup d'informations à ce sujet (et bien d'autres) sous réserve.
pourriez-vous me dire quelles sont les sections expliquer ces choses dans ce livre?
L'article 8 et l'Article 9 dans le livre.
OriginalL'auteur Fortyrunner
==
(utilisé sur les objets plutôt que sur des valeurs primitives) teste si les 2 objets sont en fait le même objet; il compare si les pointeurs sont réellement pointant vers le même emplacement de mémoire..equals()
est défini par l'objet lui-même..hashCode()
est une optimisation truc (dans la plupart de ses usages, de toute façon). Un beaucoup de code dans les bibliothèques standard fait l'hypothèse que sio1.equals(o2)==true
puiso1.hashCode()==o2.hashCode()
et que sio1.hashCode()!=o2.hashCode()
puiso1.equals(o2)==false
pour travailler plus rapidement.L'exemple le plus évident d'une telle optimisation est la HashMap classe. Cela fait de la récupération d'objets à l'aide d'une clé vraiment rapide, mais les sauts de mal si hashCode et equals ne fonctionnent pas correctement pour les éléments clés. En fait, c'est une des raisons pour lesquelles la classe String est immuable: si vous étiez en mesure de modifier une Chaîne de caractères (et donc changer son hashCode) pendant que la Chaîne a été la clé dans une table de hachage, alors vous ne serait jamais en mesure de le retrouver, puisque vous vous retrouvez à la recherche dans le mauvais endroit!
D'autres réponses recommander Efficace Java par Joshua Bloch. Si vous êtes à poser de telles questions, alors c'est maintenant le moment idéal dans votre carrière à acheter le livre et de le lire couvert à l'autre. Il va également être intéressant de re-lecture dans un an ou deux, quand vous aurez oublié certains et plus de tout cela n'aura de sens...
OriginalL'auteur Bill Michell
Le plus, c'est déjà répondu, donc voici juste un autre exemple éclairant:
OriginalL'auteur BalusC
==
opérateur --> vérifie météo 2 références pointent vers le même objet ou pas. Même si elle retourne true ou false sinon.equals( )
--> vérifie à la fois de référence et de l'état de l'objet. Entendre état signifie que les données de l'objet. Dans ce tout est vrai, il renvoie la valeur true. Sinon, false. Mais nous devons remplacerequals( )
dans notre défini par l'utilisateur de l'objet et d'écrire le code approprié.Hashcode( )
-->hashCode d'un Objet représente un nombre aléatoire qui peut être utilisé par la JVM, tout en économisant/ajout d'Objets dans Hashsets, tables de hachage ou une table de hachage.Exemple de
hashcode()
OriginalL'auteur voore vamshi