Warum funktioniert die Oracle Java-API-Dokumentation für die add()
Methode für TreeSet
und HashSet
heißt es:Konventionen in Java Dokumentation verwendet
ein Element e nur hinzugefügt wird, wenn es keine e2 in der Menge ist, wo
(e==null ? e2==null : e.equals(e2))
jedoch TreeSet
verwendet compareTo()
, während HashSet
hashCode()
verwendet Gleichheit zu bestimmen. Beide ignorieren den Wert equals()
. Ich bin besorgt, dass die Dokumentation ungenau ist, oder ist es mein Verständnis von Konvention oder der Algorithmus, der fehlerhaft ist?
Wenn hashCode() so eingestellt ist, dass immer derselbe Code zurückgegeben wird, dann scheint das Verhalten von add() von equals() abhängig zu sein. Wenn ich jedoch ein Objekt erzeuge, in dem equals() immer 'true' zurückgibt und hashCode() nicht überschreibt - also für verschiedene Objekte unterschiedlich ist - dann fügt add() mehrere Objekte hinzu. Das Verhalten von add() scheint also komplexer zu sein als in den Dokumenten angegeben. Wie Louis sagt, sind diese Situationen außerhalb des Vertrags, aber ich war an der Umsetzung interessiert (da sie nicht das tat, was sie sagte) - weiß jemand, ob es eine kanonische Spezifikation gibt? – user3038094
@ user3038094 - ich würde empfehlen zu lesen, wie HashMap funktioniert. dann werden Sie verstehen, warum die Methode 'equals()' nicht immer aufgerufen wird. Im allgemeinen Sinn verwendet HashSet _does_ '' equals() 'für die Gleichheitsprüfung. – jtahlborn
Danke jtahlborn - Ich habe deinen Rat befolgt und sehe was du meinst. Wenn der HashCode() anders ist, dann stört der Algorithmus nicht equals(), er verwendet nur equals(), wenn hashCode() gleich ist. Vermutlich liegt das daran, dass hashCode() als schneller zu evaluieren gilt als equals(), oder hat es damit zu tun, dass hashCode() ausgewertet werden muss? Also wäre es besser zu sagen in der Dokumentation: e == null? e2 == null: e.hashCode() == e2.hashCode()? e.hashCode() == e2.hashCode(): e.equals (e2) == 0 – user3038094