我刚开始学习集合,并且提到它不关心顺序,不像列表。
然而,当我输入这段代码时:
public class test {
public static void main(String[] args) {
Set<Integer> nums = new HashSet<Integer>();
nums.add(0);
nums.add(1);
nums.add(2);
nums.add(3);
for (Integer num : nums)
System.out.println(num);
}
}
基于第一行,输出应该是随机的,但它给出了有序输出:
0
1
2
3
我试图加扰添加数字的顺序,如下所示:
public class test {
public static void main(String[] args) {
Set<Integer> nums = new HashSet<Integer>();
nums.add(1);
nums.add(0);
nums.add(3);
nums.add(2);
for (Integer num : nums)
System.out.println(num);
}
}
奇怪的是,输出仍然是有序的!
在我打印出它的元素之前,有什么能以某种方式对集合进行排序吗?
或者HashSet
不是用来创建无序集合吗?
答案 0 :(得分:1)
HashSet
并未提供任何订单保证。这并不意味着对于某些数据集而言,订单不会成为其实施方式的副产品。只是你不能依赖它,它可能会从实现变为实现等等。
答案 1 :(得分:0)
这只是巧合(或者实际上是因为HashSet
内部如何工作但现在不关心这一点)。尝试添加一些值,然后删除然后添加etcetera,您将看到它无法正确打印。 HashSet
无序。除非另有说明,否则集合通常是无序的。
答案 2 :(得分:0)
HashSet
确实是未排序的集合。这意味着你不能假设任何关于它迭代(和打印)的顺序 - 就像你不能假定它将被订购一样,你也可以&假设它不会成为现实。订单完全取决于内部实施。
答案 3 :(得分:0)
HashSet在设计上是无序的。您只放置有限的小数字,它们以相同的顺序生成值的哈希码。这就是它按顺序打印的原因。请参阅下面的代码以查看哈希码并对其进行分析
for (Integer num : nums){
System.out.println(num + " - hashcode = " +num.hashCode());
}
添加更多大数字以查看无序性质。
示例:
nums.add(29000);
nums.add(199201);