Java 在HashSet类的实例中迭代,期望随机顺序,但结果总是相同的顺序

Java 在HashSet类的实例中迭代,期望随机顺序,但结果总是相同的顺序,java,collections,iteration,hashset,Java,Collections,Iteration,Hashset,我正试图学习java中集合接口和HashSet类的概念。我读过 当使用HashSet类时,不能保证序列的正确性 当我迭代时,元素的数量 我已经编写了一些代码并运行了十次,它总是按照插入的顺序进行迭代。那么这是因为运气吗 Set<Integer> set1 = new HashSet<>(); set1.add(1); set1.add(2); set1.add(3); set1.add(2); Iterator i1 = set1.iterator(); while (

我正试图学习java中集合接口和HashSet类的概念。我读过

当使用HashSet类时,不能保证序列的正确性 当我迭代时,元素的数量

我已经编写了一些代码并运行了十次,它总是按照插入的顺序进行迭代。那么这是因为运气吗

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.add(3);
set1.add(2);

Iterator i1 = set1.iterator();
while (i1.hasNext()){
    System.out.println(i1.next());
}
Set set1=new HashSet();
set1.添加(1);
set1.添加(2);
set1.添加(3);
set1.添加(2);
迭代器i1=set1.Iterator();
while(i1.hasNext()){
System.out.println(i1.next());
}
根据javadoc:

此类实现了Set接口,该接口由哈希表支持 (实际上是一个HashMap实例)。它不保证 集合的迭代顺序;特别是,它不能保证 随着时间的推移,顺序将保持不变。[…]迭代器返回 通过该类的迭代器方法,如果修改了集合,则为fail fast 在创建迭代器后的任何时间

Java4
我们有
LinkedHashSet
,它保证迭代顺序和插入顺序相同。

是。这是因为“运气”。这取决于JRE的实现!很多年前,当我开始用Java实现时,我通过艰苦的方式学会了这一点,并且代码在不同的平台上进行了测试

如果我记得的话,在windows中,HashSet的迭代是完全有序的,但在MacOSX中完全混乱了


底线:始终依赖文档,而不是明显的结果

是的,这只是巧合,
HashSet
是无序和未排序的。如果希望保持元素的顺序,可以使用
LinkedHashSet
Integer的hashcode实现使用该数字(也可以)。因此,如果条目是通过hashcode存储的,您将按顺序看到数字。