Angenommen, ich erstelle ein Objekt und füge es meinem hinzu ArrayList
. Wenn ich dann ein anderes Objekt mit genau derselben Konstruktoreingabe erstelle, contains()
bewertet die Methode die beiden Objekte als gleich? Angenommen, der Konstruktor macht mit der Eingabe nichts Lustiges und die in beiden Objekten gespeicherten Variablen sind identisch.
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;
}
}
Soll das class
so umgesetzt werden, um eine contains()
Rückkehr zu haben true
?
java
object
arraylist
evaluation
Mantas Vidutis
quelle
quelle
Object
statt einer zu akzeptierenThing
. Wenn Sie dies nicht tun, wird Ihre Methode equals nicht verwendet. :)Collections
Machen Sie ihre Sachen auf optimierte Weise, was bedeutet, dasscontains()
zuerst dashashCode
s der beiden Objekte überprüft wird und erst dann aufgerufen wirdequals()
. Wenn diehashCode
s unterschiedlich sind (was bei zwei verschiedenen Instanzen von immer der Fall istThing
), wird dieequals()
Methode nicht aufgerufen. Als Faustregel gilt, dass Sie beim Überschreibenequals()
nicht vergessen sollten, auch zu überschreibenhashCode()
.Ich denke, dass richtige Implementierungen sein sollten
quelle
if
Aussage ist unnötig.instanceof
reicht.object != null
Bedingung ist nicht erforderlich, daobject instanceof Thing
überprüft wird, ob das Objekt auch nicht null ist.Die ArrayList verwendet die in der Klasse implementierte equals-Methode (Ihre case Thing-Klasse), um den equals-Vergleich durchzuführen.
quelle
Im Allgemeinen sollten Sie bei
hashCode()
jedem Überschreibenequals()
auch überschreiben , auch wenn dies nur zur Leistungssteigerung dient.HashCode()
entscheidet, in welchen 'Bucket' Ihr Objekt beim Vergleich sortiert wird.equal()
Daher sollten zwei beliebige Objekte, die als true ausgewertet werden, dasselbe zurückgebenhashCode
value()
. Ich kann mich nicht an das Standardverhalten von erinnernhashCode()
(wenn es 0 zurückgibt, sollte Ihr Code nur langsam funktionieren, aber wenn es die Adresse zurückgibt, schlägt Ihr Code fehl). Ich erinnere mich an einige Male, als mein Code fehlgeschlagen ist, weil ich vergessen habe, ihn zu überschreibenhashCode()
. :) :)quelle
Es verwendet die equals-Methode für die Objekte. Wenn Thing nicht gleich überschreibt und die in den Objekten gespeicherten Variablen zum Vergleich verwendet, wird für die
contains()
Methode kein true zurückgegeben .quelle
Sie müssen schreiben:
Jetzt gehts ;)
quelle
Ich wollte nur beachten, dass die folgende Implementierung falsch ist, wenn
value
es sich nicht um einen primitiven Typ handelt:In diesem Fall schlage ich Folgendes vor:
quelle
Andere Poster haben sich mit der Frage befasst, wie enthält () funktioniert.
Ein ebenso wichtiger Aspekt Ihrer Frage ist die ordnungsgemäße Implementierung von equals (). Und die Antwort darauf hängt wirklich davon ab, was Objektgleichheit für diese bestimmte Klasse ausmacht. Wenn Sie in dem von Ihnen angegebenen Beispiel zwei verschiedene Objekte haben, die beide x = 5 haben, sind sie gleich? Es hängt wirklich davon ab, was Sie versuchen zu tun.
Wenn Sie nur an Objektgleichheit interessiert sind, verwendet die Standardimplementierung von .equals () (die von Object bereitgestellte) nur die Identität (dh this == other). Wenn Sie dies möchten, implementieren Sie equals () einfach nicht in Ihre Klasse (lassen Sie sie von Object erben). Der von Ihnen geschriebene Code ist zwar korrekt, wenn Sie sich für eine Identität entscheiden, wird jedoch niemals in einer realen Klasse b / c angezeigt. Er bietet keinen Vorteil gegenüber der Verwendung der Standardimplementierung von Object.equals ().
Wenn Sie gerade erst mit diesem Zeug anfangen, empfehle ich dringend das Effective Java-Buch von Joshua Bloch. Es ist eine großartige Lektüre und behandelt diese Art von Dingen (und wie man equals () korrekt implementiert, wenn Sie versuchen, mehr als nur identitätsbasierte Vergleiche durchzuführen).
quelle
Verknüpfung von JavaDoc :
Boolescher Wert enthält (Objekt o)
Gibt true zurück, wenn diese Liste das angegebene Element enthält. Genauer gesagt, gibt true genau dann zurück, wenn diese Liste mindestens ein Element e enthält, so dass (o == null? E == null: o.equals (e))
quelle