Kurz erklärt
Die gebräuchlichste Set-Implementierung — nutzt intern eine Hash-Tabelle, dadurch sind Einfügen, Entfernen und Enthaltensein-Prüfung im Schnitt sehr schnell (konstante Zeit).
Genauer
Die Reihenfolge der Elemente ist bei HashSet nicht garantiert und kann sich sogar zwischen Programmläufen unterscheiden — wer eine vorhersehbare Reihenfolge braucht, sollte stattdessen TreeSet (sortiert) oder LinkedHashSet (Einfügereihenfolge) verwenden. Damit ein eigenes Objekt korrekt in einem HashSet funktioniert, müssen equals() und hashCode() konsistent überschrieben sein.