我知道HashSet
内部工作为HashMap
,HashMap
内部使用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
答案 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的存储桶中,因此会以不同的顺序返回。
永远不应该依赖 HashMap
和HashSet
来提供任何特定的排序。您可以使用LinkedHashMap
保留广告订单,或使用TreeMap
对条目进行排序。