为什么类HashSet <T>在使用迭代器时已经对值进行了排序?

Sdd*_*ddf 6 java iterator hashset

我在我的main方法上有以下代码,当我遍历Set并打印值时,值已经被排序.什么原因?

Set<Integer> set = new HashSet<Integer>();
set.add(2);
set.add(7);
set.add(3);
set.add(9);
set.add(6);

for(int i : set) {
    System.out.println(i);
}
Run Code Online (Sandbox Code Playgroud)

输出:

2
3
6
7
9
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 4

这只是巧合。AHashSet不保留或保证任何订购。

它不保证集合的迭代顺序;特别是,它不保证顺序随着时间的推移保持不变。

  • 这并非巧合。这是“Integer”中“hashCode”实现的问题。 (3认同)
  • @LouisWasserman,@SotiriosDelimanolis 我同意这不应该是您应该依赖的东西,因为它是实现细节。它不适用于任何整数集。但效果是 loadFactor、有效底层数组容量以及所有元素都是小于容量的正整数的结果。显然不是巧合。我注意到 `HashMap` 使用了这样的技巧 `(h = key.hashCode()) ^ (h &gt;&gt;&gt; 16)`,但它不会影响小值。 (2认同)