Warum erlaubt HashSet gleiche Elemente, wenn die Hashcodes unterschiedlich sind?

DasHashSet Klasse hat einehinzufügen (Objekt o) Methode, die nicht von einer anderen Klasse geerbt wird. Das Javadoc für diese Methode besagt Folgendes:

Fügt das angegebene Element zu dieser Gruppe hinzu, sofern es nicht bereits vorhanden ist. Fügt das angegebene Element formal hinzue zu dieser Menge, wenn diese Menge kein Element enthälte2 so dass(e==null ? e2==null : e.equals(e2)). Wenn diese Menge bereits das Element enthält, lässt der Aufruf die Menge unverändert und kehrt zurückfalse.

Mit anderen Worten, wenn zwei Objekte gleich sind, wird das zweite Objekt nicht hinzugefügt und das HashSet bleibt gleich. Ich habe jedoch festgestellt, dass dies bei Objekten nicht zutriffte unde2 unterschiedliche Hashcodes haben, obwohle.equals(e2). Hier ist ein einfaches Beispiel:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Random;

public class BadHashCodeClass {

    /**
     * A hashcode that will randomly return an integer, so it is unlikely to be the same
     */
    @Override
    public int hashCode(){
        return new Random().nextInt();
    }

    /**
     * An equal method that will always return true
     */
    @Override
    public boolean equals(Object o){
        return true;
    }

    public static void main(String... args){
        HashSet<BadHashCodeClass> hashSet = new HashSet<>();
        BadHashCodeClass instance = new BadHashCodeClass();
        System.out.println("Instance was added: " + hashSet.add(instance));
        System.out.println("Instance was added: " + hashSet.add(instance));
        System.out.println("Elements in hashSet: " + hashSet.size());

        Iterator<BadHashCodeClass> iterator = hashSet.iterator();
        BadHashCodeClass e = iterator.next();
        BadHashCodeClass e2 = iterator.next();
        System.out.println("Element contains e and e2 such that (e==null ? e2==null : e.equals(e2)): " + (e==null ? e2==null : e.equals(e2)));
    }

Die Ergebnisse der Hauptmethode sind:

Instance was added: true
Instance was added: true
Elements in hashSet: 2
Element contains e and e2 such that (e==null ? e2==null : e.equals(e2)): true

Wie das obige Beispiel deutlich zeigt, konnte HashSet zwei Elemente hinzufügene.equals(e2).

Ich gehe davon aus, dass dies istnicht ein Fehler in Java und dass es tatsächlich eine vollkommen rationale Erklärung dafür gibt, warum dies so ist. Aber ich kann nicht genau herausfinden, was. Was vermisse ich?

Antworten auf die Frage(5)

Ihre Antwort auf die Frage