LinkedHashMap:第一个键变为最后一个

时间:2013-08-30 07:16:32

标签: java

我使用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

这是As Expexted

但有时会提供输出

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

这不是预期的

问题是第一个键成为最后一个 ...这是LinkedHashMap做错了什么。 请给我解决方案 我想保留订单,第一个值应该首先不是最后一个。

2 个答案:

答案 0 :(得分:4)

Doc说 -

  

此链接列表定义了迭代排序,通常是   键插入到地图中的顺序(插入顺序)。注意   如果重新插入密钥,则不会影响该插入顺序   地图。

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 :(得分:-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);
        }