Java - 设置不按顺序打印

时间:2014-12-13 15:21:48

标签: java

我刚开始学习集合,并且提到它不关心顺序,不像列表。

然而,当我输入这段代码时:

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不是用来创建无序集合吗?

4 个答案:

答案 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);