Comment fonctionne une liste de tableaux de la méthode contains() évaluer des objets?
Dis-je en créer un objet et de l'ajouter à ma ArrayList
. Si je puis créer un autre objet avec exactement le même constructeur, seront les contains()
méthode évaluer les deux objets à la même chose? Supposons que le constructeur ne veut pas faire quelque chose de drôle avec l'entrée, et les variables stockées dans les deux objets sont identiques.
ArrayList<Thing> basket = new ArrayList<Thing>();
Thing thing = new Thing(100);
basket.add(thing);
Thing another = new Thing(100);
basket.contains(another); //true or false?
class Thing {
public int value;
public Thing (int x) {
value = x;
}
equals (Thing x) {
if (x.value == value) return true;
return false;
}
}
Est-ce que le class
doit être mise en oeuvre pour contains()
retour true
?
Vous devez vous connecter pour publier un commentaire.
ArrayList
implements
la Liste de l'Interface.Si vous regardez la Javadoc pour
List
à lacontains
méthode, vous allez voir qu'il utilise leequals()
méthode pour évaluer si deux objets sont les mêmes.Object
plutôt qu'unThing
. Si vous ne le faites pas, votre méthode equals ne sera pas utilisé. 🙂Collections
faire leur travail de façon optimisée, ce qui signifie quecontains()
tout d'abord vérifie lahashCode
s des deux objets, et ensuite seulement les appelsequals()
. Si lehashCode
s sont différents (ce qui est toujours le cas pour les deux instances différentes deThing
), leequals()
méthode ne sera pas appelé. En règle générale, lorsque vous remplacezequals()
, vous ne devez pas oublier de remplacerhashCode()
aussi.Je pense qu'en ce implémentations devraient être
if
déclaration est inutile.instanceof
est assez.object != null
condition est inutile, carobject instanceof Thing
vérifie que l'objet est non null.La liste de tableaux utilise la méthode equals mis en œuvre dans la classe (votre cas Chose de classe) pour en faire l'égale de comparaison.
Généralement, vous devriez également de remplacer
hashCode()
chaque fois que vous remplacezequals()
, même si c'est juste pour le gain de performance.HashCode()
décide de "seau" votre objet devient triés sur quand faire une comparaison, de sorte que toute les deux objets quiequal()
évalue à true renvoie le mêmehashCode
value()
. Je ne me souviens pas le comportement par défaut dehashCode()
(si elle retourne 0 alors votre code devrait fonctionner, mais lentement, mais si elle renvoie l'adresse puis votre code suivant ne fonctionnera pas). Je me souviens d'un tas de fois lors de mon code a échoué parce que j'ai oublié de remplacerhashCode()
bien. 🙂Il utilise la méthode equals sur les objets. Donc à moins de Chose remplacements d'égal à égal et utilise les variables stockées dans les objets à des fins de comparaison, il ne retournera pas vrai sur le
contains()
méthode.Vous devez écrire:
Maintenant ça fonctionne 😉
Voulais juste noter que la suite de la mise en œuvre est le problème quand
value
n'est pas un type primitif:Dans ce cas, je propose ce qui suit:
D'autres affiches ont abordé la question de savoir comment contains() fonctionne.
Un aspect tout aussi important de votre question est de savoir comment correctement implémenter equals(). Et la réponse à cela est vraiment dépendante de ce qui constitue l'objet de l'égalité pour cette classe particulière. Dans l'exemple fourni par vous, si vous avez deux objets différents qui ont tous deux x=5, sont-ils égaux? Cela dépend vraiment de ce que vous essayez de faire.
Si vous êtes uniquement intéressé par l'objet de l'égalité, alors le par défaut mise en œuvre de l' .equals() (celui fourni par Objet) utilise l'identité seulement (c' == les autres). Si c'est ce que vous voulez, puis il suffit de ne pas implémenter equals() de votre classe (laisser hériter de l'Objet). Le code que vous avez écrit, tout type de corriger si vous allez pour l'identité, n'apparaissent jamais dans une vraie classe b/c il ne fournit aucune prestation sur l'utilisation de l'Objet par défaut.equals() de la mise en œuvre.
Si vous êtes juste de commencer avec ce genre de choses, je vous recommande fortement de l'efficacité de Java livre de Joshua Bloch. C'est une excellente lecture, et couvre ce genre de chose (plus correctement implémenter equals() lorsque vous essayez de faire plus que de l'identité des comparaisons)
Raccourci à partir de JavaDoc:
boolean contains(Object o)
Retourne true si cette liste contient l'élément spécifié. Plus formellement,
retourne true si et seulement si cette liste contient au moins un élément de e tel
que (s==null ? e==null : o.est égal à(e))