2012-09-13 146 views
1

我們都知道Set(除了它們的這種實現)doesn't guarantee的迭代排序。所以我試圖確保這與下面的示例代碼。Java集訂購

public static void main(String[] args) throws InterruptedException { 
    Map<String,String> lMap=new HashMap<String, String>(); 
    lMap.put("A", "A"); 
    lMap.put("B", "B"); 
    lMap.put("C", "C"); 
    lMap.put("D", "D"); 
    lMap.put("E", "E"); 
    lMap.put("F", "F"); 
    lMap.put("G", "G"); 
    lMap.put("H", "H"); 
    lMap.put("I", "I"); 
    lMap.put("J", "J"); 
    lMap.put("K", "K"); 
    lMap.put("L", "L"); 
    for(int i=0;i<10000;i++){ 

     Thread.sleep(100); 
     Set<Entry<String, String>> entrYset=lMap.entrySet(); 
     for(Map.Entry<String, String> e:entrYset){ 
      System.out.println(e.getKey()+" , "+e.getValue()); 
     } 
        System.out.println("******************************************************"); 
    } 
} 

我在代碼上執行了很多次,發現它是打印記錄的順序。

我的問題是,如果java聲稱HashMap是無序的,那麼爲什麼這個記錄打印的順序。如果有人可以給我理由,例如,這將是偉大的。

+1

你爲什麼要印10000次?如果地圖未被修改,訂單將始終保持不變。 – gontard

回答

5

訂單每次都是一樣的,因爲字符串的散列碼不會改變,而且您按照相同的順序插入。哈希映射是確定性的,所以如果你創建相同的哈希映射並以相同的順序插入東西,你總會得到一致的順序。

散列圖並不保證此排序將保持一致。如果插入更多項目,排序可能會隨着哈希表重建而完全更改。

+2

這意味着除非我不修改hashmap,否則oreder將保持不變? – amicngh

+1

是的,這是一個更好的方式! –

2

當您向地圖添加新元素時,通常會進行重新排序。如果地圖得到調整,訂單可能會改變。

0

你錯了。如果你看一下Javadoc,它說

This class makes no guarantees as to the order of the map; 
In particular, it does not guarantee that the order will remain constant over time 

注意,文件說,沒有具體的保證關於維護插入順序可以一個HashMap保證。這在大多數情況下與HashMap內部調整大小時有關。

嘗試通過使用此構造方法HashMap(int initialCapacity, float loadFactor)複製內部調整大小與參數:initialCapacityloadFactor打。我認爲你可以看到差異。哦,當我執行你的代碼時,我的排序與你發佈的問題完全不同。

1

其因字符串的散列碼

public int hashCode() { 
    int h = hash; 
    if (h == 0 && count > 0) { 
     int off = offset; 
     char val[] = value; 
     int len = count; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 

與一個字母串將是H = 31 * 0 +字符 的數值因此,所有的散列碼是1)低2)中相同的順序的字母。因此它很可能會按照這個順序返回。

0

Hash Tables使用散列函數將值放入集合中。因此,其順序可能會根據哈希值而改變。因此,您將相同的值添加到具有相同散列函數的散列表中。這就是爲什麼你看到你的訂單。嘗試更改插入值的值或順序。它可能會改變結果的順序。

0

你很混淆「不保證」與「保證不是」。

當然HashMap可以有一些內部排序。

文檔聲明的唯一不足是你不應該依賴HashMap中的項目順序,如果你這樣做(基於類似於你的實驗的結果) - 你已經被警告過了。