我知道HashSet内部在内部用作HashMap和HashMap

时间:2015-04-17 05:36:55

标签: java collections

我知道HashSet内部工作为HashMapHashMap内部使用LinkedList作为FIFO等。所以我的问题是当我在StudentRecord课程中插入值时模式中的对象,如..

    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

4 个答案:

答案 0 :(得分:3)

使用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());
    }

}

答案 1 :(得分:1)

LinkedHashMap可用于此目的。

HashMap相同,只是当您iterate覆盖它时,它会以插入顺序显示项目。

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

来自JavaDoc

  

此课程不保证地图的顺序;在   特别是,它不保证订单将保持不变   随着时间的推移。

答案 2 :(得分:0)

LinkedHashSet将为您保留插入顺序。

答案 3 :(得分:0)

由于其他答案都没有实际回答“为什么”:

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

在此示例中,3.已添加到早于2或3的存储桶中,因此会以不同的顺序返回。

永远不应该依赖

HashMapHashSet来提供任何特定的排序。您可以使用LinkedHashMap保留广告订单,或使用TreeMap对条目进行排序。