Ich habe diesen Test in einem HashSet-Vergleich durchgeführt und equals
wird nicht aufgerufen
Ich möchte gleich betrachten, wenn farAway = false (Eine Funktion, um zwei Punktabstände zu prüfen)
Vollständiger kompilierbarer Code, Sie könnten ihn testen und erklären, warum in diesem Beispiel kein equals aufgerufen wird.
%Vor%BEARBEITEN
- Gibt es eine Möglichkeit, HashSet add to ruf gleich zu erzwingen?
Wenn sich die Hash-Codes unterscheiden, müssen Sie equals()
nicht aufrufen, da garantiert ist, dass false
zurückgegeben wird.
Dies folgt aus dem allgemeinen Vertrag auf equals()
und hashCode()
:
Wenn zwei Objekte entsprechend der Methode
equals(Object)
gleich sind, muss das Aufrufen derhashCode
-Methode für jedes der beiden Objekte das gleiche ganzzahlige Ergebnis ergeben.
Im Moment bricht Ihre Klasse diesen Vertrag. Sie müssen das beheben.
Wenn equals()
immer aufgerufen werden soll, geben Sie einfach immer 0
in hashCode()
ein. Auf diese Weise haben alle Artikel den gleichen Hashcode und werden nur mit equals()
verglichen.
Es klingt, als wäre HashSet nicht richtig für Sie. Es klingt, als ob Sie eine benutzerdefinierte Methode zum Vergleich zweier Positionen wünschen. Anstatt zu sagen "sind zwei Positionen genau gleich?". Stattdessen sollten Sie TreeSet mit einem Vergleicher betrachten. Auf diese Weise können Sie einen "IsWithinRangeComparator" schreiben und dort Ihren Bereich überprüfen.
Tags und Links java comparison equals hashset