我知道 HashSet Internally work as HashMap and HashMap internally
I know HashSet Internally work as HashMap and HashMap internally
我知道 HashSet
在内部作为 HashMap
和 HashMap
在内部使用 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 更早的存储桶中,结果以不同的顺序返回。
HashMap
和 HashSet
不应依赖于提供任何特定的排序。您可以使用 LinkedHashMap
保留插入顺序或使用 TreeMap
对条目进行排序。
我知道 HashSet
在内部作为 HashMap
和 HashMap
在内部使用 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 更早的存储桶中,结果以不同的顺序返回。
HashMap
和 HashSet
不应依赖于提供任何特定的排序。您可以使用 LinkedHashMap
保留插入顺序或使用 TreeMap
对条目进行排序。