2014-12-13 83 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不提供任何訂單保證。這並不意味着對於一些數據集來說,訂單不可能作爲它如何實現的副產品出現。只是你不能依賴它,並且它可能會從實現變爲執行等。