2014-12-13 58 views
1

我刚开始学习有关集合,有人提到它不关心顺序,与列表不同。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不适用于创建无序集?

+0

不具有由于某些事情的保证是不一样的具有对于某些东西相反的保证。 – null 2014-12-13 15:34:44

回答

0

HashSet是按设计无序的。您只将有限的小数字按相同的顺序生成值的哈希码。这就是为什么它按顺序打印。请参见下面的代码,看看哈希码和分析

for (Integer num : nums){ 
    System.out.println(num + " - hashcode = " +num.hashCode()); 
} 

添加几个大数在行动中看到无序性质。

实施例:

nums.add(29000); 
nums.add(199201); 
0

这只是一个巧合(或者实际上是因为HashSet如何在内部工作,但现在不在意)。尝试添加更多的值,然后删除然后添加etcetera,您将看到它无法正确打印。 HashSet是无序的。除非另有说明,否则集合通常是无序的。

0

A HashSet确实是一个未排序的集合。这意味着你不能假设关于它迭代(和打印)的顺序的任何东西 - 与你不能假定它将被排序的相同方式,你也不能认为它不会。订单完全取决于内部实施。

1

HashSet不提供任何订单保证。这并不意味着对于一些数据集来说,订单不可能作为它如何实现的副产品出现。只是你不能依赖它,并且它可能会从实现变为执行等。