更新:我之前的回答是错误的。如果不修改默认行为,您将无法做到这一点!见下文为什么。
..如何获取最后输入的条目或输入的键?
从LinkedHashMap的API描述可以读到:
结构修改是添加或删除一个或多个映射的任何操作,或者在访问排序的链接哈希映射的情况下,会影响迭代顺序。在 insertion-ordered 链接哈希映射中,仅更改与映射中已包含的键关联的值并不是结构修改。在 access-ordered 链接的哈希映射中,仅使用 get 查询映射是一种结构修改。
那么这一切意味着什么?
-
access-ordered - 每次您执行
put 或 get 时,元素的顺序都会发生变化
-
insertion-ordered - 插入元素时(第一次)它们最后添加
例如:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
... 将打印带有 insertion-ordered 的 {1=10, 2=2} 和带有 *access-ordered' 的 {2=2, 1=10}。问题在于使用access-ordered,当然如果您执行get 操作,顺序也会发生变化。
如何解决
那么...如何解决。那么LinkedHashMap不能直接使用。所以你可以包装它(不要关心老生常谈的名字)并覆盖 put 和 putAll 方法,以便他们在放回地图之前先从地图中删除密钥!
class BestLinkedHashMap<K, V> extends LinkedHashMap<K, V> {
@Override
public V put(K key, V value) {
V last = super.remove(key);
super.put(key, value);
return last;
}
@Override
public void putAll(Map<? extends K, ? extends V> m) {
for (K key : m.keySet())
super.remove(key);
super.putAll(m);
}
}
然后要获取最后一个元素,请执行以下操作:
-
将输出包装在 LinkedList 实现中:
V v = new LinkedList<V>(map.values()).getLast();
-
toArray()方式:
Collection<V> values = map.values();
V v = values.toArray(new V[0])[values.size() - 1];
-
使用迭代器迭代到最后一个元素:
Iterator<V> it = values.iterator();
V last = null;
while (it.hasNext())
last = it.next();