LinkedHashMap
描述说“它维护一个贯穿其所有条目的双向链表”所以我想知道如何获取最后一个条目或输入的键?我可以自信地沮丧.values()
以LinkedList
获得该双向链表并使用.getLast()
它吗?还是它是其他 Java 集合的实例?
如果可能的话,我想坚持下去java.util
。
LinkedHashMap
描述说“它维护一个贯穿其所有条目的双向链表”所以我想知道如何获取最后一个条目或输入的键?我可以自信地沮丧.values()
以LinkedList
获得该双向链表并使用.getLast()
它吗?还是它是其他 Java 集合的实例?
如果可能的话,我想坚持下去java.util
。
是的,您可以获得最后一个元素。但是您必须查看其他人的建议才能获得Collection<V>
返回的最后一个元素values()
。
我在源代码中检查了返回的值确实符合预期的顺序:AbstactCollection<V>
返回的值LinkedListMap.values()
由 over 值支持,Iterator<V>
该值本身直接链接到Iterator<K>
over 键。显然,Iterator<K>
over the keys 是用有序的双向链表实现的。
不,对不起,你不能。
“维护的双向链表”不是任何 java.util.LinkedList 类型或其他集合。它是在 LinkedHashMap 和 LinkedHashMap.Entry 类中手动实现的。
您只能构建然后LinkedList
使用:values()
letLast()
Foo last = new LinkedList<Foo>(myLinkedHashMap.values()).getLast();
更新:我之前的回答是错误的。如果不修改默认行为,您将无法做到这一点!见下文为什么。
..如何获得最后一个条目或输入的键?
从您的 API 描述中LinkedHashMap
可以阅读:
结构修改是添加或删除一个或多个映射的任何操作,或者在访问排序的链接哈希映射的情况下,影响迭代顺序。在插入顺序的链接哈希映射中,仅更改与映射中已包含的键关联的值不是结构修改。在按访问顺序链接的哈希映射中,仅使用 get 查询映射是一种结构修改。
那么这一切意味着什么?
put
或 aget
时,元素的顺序都会发生变化例如:
map.put(1, 1);
map.put(2, 2);
map.put(1, 10);
System.out.println(map);
{1=10, 2=2}
...将以插入顺序和{2=2, 1=10}
*access-ordered打印。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();
我已经“扩展”了 Jdk LinkedHashMap 以允许这样做,您可以查看:LinkedHashMapEx.java