2011-03-04 42 views
3

我想知道HashMap中包含的值的Collection視圖是否在HashMap更改時保持有序。例如,如果我有一個HashMap,其values()方法返回L = {a,b,c} 如果向地圖添加新元素「d」,L會發生什麼? 它是否在最後添加,即如果我遍歷元素,它保存的順序?Java HashMap和基礎值()集合

特別是,如果添加新元素「d」導致重新散列,那麼訂單是否會保留在L中?

非常感謝!

回答

5

我想知道HashMap中包含的值的Collection視圖是否在HashMap更改時保持有序。

不,沒有這樣的保證。

如果是這樣的話,那麼下面的程序將輸出和有序序列1-100

HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 

for (int i = 0; i < 100; i++) 
    map.put(i, i); 

System.out.println(map.values()); 

and it doesn't)

有一類是不正是你問什麼,那就是LinkedHashMap

哈希表和Map接口的鏈接列表實現,具有可預知迭代順序該IMPL ementation與HashMap的不同之處在於它維護着一個雙向鏈表,它貫穿其所有條目。 此鏈接列表定義了迭代排序,通常是將鍵插入到地圖(插入順序)中的順序。

+0

在我的機器上... – TofuBeer 2011-03-04 15:47:00

+0

@TofuBeer:不是我的... – dacwe 2011-03-04 15:49:04

+0

@TofuBeer,你確定嗎?你讀完整個序列?你正在使用哪個運行時? – aioobe 2011-03-04 15:49:28

0

HashMap的Java中是沒有順序的,所以我認爲這將是安全地說,值()將不會返回的有序集合。

LinkedHashMap是HashMap(插入順序)的有序版本,但我不知道它的值()將返回一個有序的集合。我認爲最好的是嘗試。

+0

我試過了。他們都沒有保持插入的順序。有趣的是,它們都以相同的順序返回相同的集合:我懷疑它是基於hashcode()方法的值 – javaexpert 2011-03-04 15:54:28

+0

@javaexpert:您能否使用LinkedHashMap發佈結果而不使用插入順序?根據它的文件,它應該是。 (一個普通的HashMap的迭代器通過bucket命令元素,這些元素由'hashCode'的結果填充(以容量爲模),但沒有指定,它可以是任何順序。) – 2011-03-04 17:56:25

1

如果它沒有在JavaDoc中說明,那麼就沒有保證。不同版本的Java可以做不同的事情。不要依賴無證行爲。您可能想要查看LinkedHashMap

+0

+1用於提及LinkedHashMap – 2011-03-04 15:44:27

0

當你使用HashMap時,它們通常不能保證順序。它可能按照爲少數元素添加元素的順序排列,但在發生碰撞時可能會重新洗牌,並且必須採用衝突解決策略。