我知道 HashSet Internally work as HashMap and HashMap internally

I know HashSet Internally work as HashMap and HashMap internally

我知道 HashSet 在内部作为 HashMapHashMap 在内部使用 LinkedList 作为 FIFO 等。所以我的问题是当我在 [=16= 中插入值时] class 对象的模式如..

    StudentsRecord record=new StudentsRecord(1, "Pramod", "UNA");
    StudentsRecord record2=new StudentsRecord(2, "Pankaj","Lucknow");
    StudentsRecord record3=new StudentsRecord(3, "Santosh","Chennai");

    HashSet<StudentsRecord> set=new HashSet<StudentsRecord>();
    set.add(record);
    set.add(record2);
    set.add(record3);

    Iterator<StudentsRecord> iterator=set.iterator();
    while(iterator.hasNext())
    {
        StudentsRecord result=(StudentsRecord)iterator.next();
        System.out.println(result.getId()+","+result.getName()+","+result.getAddress());
    }

为什么我的结果不遵循 FIFO 或 LIFO 顺序模式? 我的输出是:

3,Santosh,Chennai
1,Pramod,UNA
2,Pankaj,Lucknow

LinkedHashMap 可用于此目的。

它与 HashMap 相同,只是当您 iterate 在它上面时,它会按插入顺序显示项目。

基本上它保留了插入顺序。

来自 JavaDoc

This class makes no guarantees as to the order of the map; in particular, it does not guarantee that the order will remain constant over time.

LinkedHashSet 将为您保留插入顺序。

使用 LinkedHashSet 而不是 HashSet。因为 LinkedHashSet 维护插入顺序。

public static void main(String[] args) {
    StudentsRecord record=new StudentsRecord(1, "Pramod", "UNA");
    StudentsRecord record2=new StudentsRecord(2, "Pankaj","Lucknow");
    StudentsRecord record3=new StudentsRecord(3, "Santosh","Chennai");


    Set<StudentsRecord> set=new LinkedHashSet<StudentsRecord>();
    set.add(record);
    set.add(record2);
    set.add(record3);


    Iterator<StudentsRecord> iterator=set.iterator();
    while(iterator.hasNext())
    {
        StudentsRecord result=(StudentsRecord)iterator.next();
        System.out.println(result.getId()+","+result.getName()+","+result.getAddress());
    }

}

因为 none 个其他答案实际上回答了 "why":

HashMap 将对象存储到桶中,然后只使用桶中的列表。这就是它能够快速找到对象的方式,因为它可以直接进入正确的桶,然后只需要扫描该桶内的条目。

在此示例中,3. 已被添加到比 2 或 3 更早的存储桶中,结果以不同的顺序返回。

HashMapHashSet 不应依赖于提供任何特定的排序。您可以使用 LinkedHashMap 保留插入顺序或使用 TreeMap 对条目进行排序。