2013-08-30 60 views
0

我使用LinkedHashMap的保留數據LinkedHashMap的:第一個關鍵是成爲最後

我的特定功能包含此地圖的插入順序...

Map retainOrder(){ 

    Map map= new LinkedHashMap<Long,String>(); 

    map.put(1L,"A"); 
    map.put(2L,"B"); 
    map.put(3L,"C"); 
    map.put(4L,"D"); 
    map.put(5L,"E"); 
    return map; 
} 

我通過調用retainOrder獲得輸出()函數

1:A 
2:B 
3:c 
4:D 
5:E 

這是由於Expexted

但有時我T得到輸出

2:B 
    3:c 
    4:D 
    5:E 
    1:A 

這不是預期

問題是,第一密鑰成爲最後 ...這是LinkedHashMap的做錯了什麼。 請給我解決方案 我想保留訂單,第一個值應該是第一個不能最後。

+0

你怎麼打印地圖? – DThought

+0

使用sorteMap。供您參考: http://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-sortedmap-in-java –

+3

'Sometimes'!?你如何打印你的輸出? – rocketboy

回答

4

Doc says-

該鏈接列表定義迭代排序,這通常是在哪個鍵被插入到圖(插入順序) 順序。注意 如果將密鑰重新插入 映射中,則插入順序不受影響。

Map<Long, String> map = new LinkedHashMap<Long, String>(); 

map.put(1L, "A"); 
map.put(2L, "B"); 
map.put(3L, "C"); 
map.put(4L, "D"); 
map.put(5L, "E"); 

final Iterator<Long> cursor = map.keySet().iterator(); 
while (cursor.hasNext()) { 
    final Long key = cursor.next();   
    final String value = map.get(key); 
    System.out.println(key + "\t" + value); 
} 

所以,除非你是在你的代碼的某個地方改變順序,應該打印爲您插入。

-1

當數據數量大於閾值(容量* loadFactor)時,地圖將調整大小,並且順序將被更改。 這是一塊HashMap.class的源代碼的:

void addEntry(int hash, K key, V value, int bucketIndex) { 
      Entry<K,V> e = table[bucketIndex]; 
      table[bucketIndex] = new Entry<>(hash, key, value, e); 
      if (size++ >= threshold) 
       resize(2 * table.length); 
     } 
相關問題