Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich versuch aktuell die Collections zu begreifen.
Ein HashSet ist ein ungeortneter Collectiontyp.
Dies hat zur Folge das die Ausgabe der Elemte der
HashSet zufällig ist. Ich bekomme jedoch immer
die gleiche Ausgabe:
Jannis
Doro
Markus
Klaus
Code:
import java.util.HashSet;
public class Hash_Set {
public static void main(String[] args) {
String s1 = "Jannis";
String s2 = "Markus";
String s3 = "Klaus";
String s4 = "Doro";
HashSet menschenNamen = new HashSet();
menschenNamen.add(s1);
menschenNamen.add(s2);
menschenNamen.add(s3);
menschenNamen.add(s4);
for (Object i : menschenNamen){
System.out.println(i);
}
}
}
Müsste die Ausgabe nicht immer eine andere sein,
oder habe ich da irgendwas nicht richtig verstanden?
Die Ausgabe ist nicht zufällig und jedes mal anders. Ungeordnet heißt hier nur, dass die Ausgabe eine andere Reihenfolge haben kann als deine Eingabe. In deinem Beispiel hast du z.B. Doro als letztes hinzugefügt, jedoch wird Doro schon als zweites ausgegeben.
Falls du nun weitere Elemente einfügst, kann sich die Reihenfolge wieder ändern. Solange du nun nichts am HashSet änderst, wird sich auch nicht die Reihenfolge ändern
Mit "ungeordnet" ist nicht "zufällig" gemeint, sondern dass die Elemente nicht in einer bestimmen Ordnung ausgegeben werden, wie es beispielsweise bei einer alphabetischen Sortierung wäre. Wenn sich am Inhalt des HashSet und an der Hashfunktion nichts ändert, ändert sich auch nichts an der Reihenfolge bei der Ausgabe.
Aber es kann (muss nicht) passieren, dass die Ausgabereihenfolge bei gleichen Elementen und gleicher Hashfunktion unterschiedlich ist, falls die Elemente nicht in derselben Reihenfolge eingefügt werden.
Hm, also wenn "ungeordnet" nicht "zufällig" heißt und die Ausgabe nicht Lexikographisch ist, die Ausgabe aber dennoch immer die Gleiche ist, nach welchen Regelungen entscheidet der Compiler dann die Ausgabe?
Der Compiler hat damit nichts zu tun, das liegt an der Implementation des HashSet und an dem HashCode. Die Grundidee eines HashSets kannst du dir wie folgt vorstellen (Achtung, extrem stark vereinfacht!)
Stell dir vor dein HashSet ist einfach eine Tabelle aus 26 Zeilen. Wenn du nun etwas darin einfügen möchtest (z.B. "Jannis"), dann wird eine Hash Funktion genutzt, welche diesem Objekt eine einfache Zahl zuweist. Als einfaches Beispiel, nimm an das die Hash Funktion sich nur den ersten Buchstaben anguckt und die Zahlen 0 bis 25 zurückgibt, jenachdem ob der Buchstaben eben ein A ... Z ist.
Da Jannis mit J anfängt würde in diesem Beispiel also 9 zurückgegeben werden.
Daher würde Jannis in Zeile 9 eines internen Arrays gelegt werden. Doro in Zeile 3 usw.
Wenn du nun über alle Elemente läufst, werden eben alle nicht leeren Zeilen angeguckt und daher ist deine Ausgabe Reihenfolge nicht unbedingt die Eingabe Reihenfolge.
Im Detail ist das natürlich komplizierter, insbesondere ist die Hash Funktion komplizierter und man muss außerdem noch Kollisionen behandeln, also die Fälle in denen zwei verschiedene Objekte den gleichen hash haben
In deinem Beispiel spielen zwei Faktoren eine Rolle.
Erstens: In welcher Reihenfolge iteriert die for-Schleife über die Elemente? Ich glaube, das wird durch die iterator()-Methode des HashSet bestimmt. Ich weiß nicht, wie es konkret implementiert ist, vermute aber, dass es einfach die physikalische Reihenfolge ist, in der die Elemente gespeichert sind.
Zweitens: Wie wird die physikalische Reihenfolge festgelegt, in der die Elemente gespeichert werden? Das wird durch die Hashfunktion bestimmt, wie @InfectedBytes bereits erläutert hat.