Wann ist HashSet 'add' Methodenaufrufe gleich?

7

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?

    
Hernán Eche 24.01.2013, 15:29
quelle

4 Antworten

22

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 der hashCode -Methode für jedes der beiden Objekte das gleiche ganzzahlige Ergebnis ergeben.

Im Moment bricht Ihre Klasse diesen Vertrag. Sie müssen das beheben.

    
NPE 24.01.2013, 15:30
quelle
4

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.

%Vor%     
Sebastian Krysmanski 24.01.2013 15:56
quelle
1

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.

    
Mr Spoon 24.01.2013 15:59
quelle
-1

Wie oben vorgeschlagen, sollte der Hash-Code bei gleichen Objekten auch gleich sein. Sie können Ihre Hashcode-Berechnung wie unten beschrieben einfach korrigieren.

%Vor%

}

    
Zenil 24.01.2013 15:43
quelle

Tags und Links