0

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

这是如实说明

但有时它会给出输出

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

这不是预期的

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

4

2 回答 2

4

医生说——

这个链表定义了迭代顺序,通常是键插入映射的顺序(插入顺序)。请注意,如果将键重新插入到地图中,则插入顺序不会受到影响。

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);
}

因此,除非您在代码中的某处更改顺序,否则它应该在您插入时打印。

于 2013-08-30T07:22:11.620 回答
-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);
        } 
于 2013-08-30T07:48:22.797 回答