我使用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做错了什么。 请给我解决方案 我想保留订单,第一个值应该首先不是最后一个。
答案 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);
}