Java LinkedHashMap与HashMap中的删除
Java LinkedHashMap与HashMap中的删除,java,collections,hashmap,time-complexity,Java,Collections,Hashmap,Time Complexity,LinkedHashMap中的删除需要线性时间,对吗。因为我们需要从保持插入顺序的链表中删除键,这需要O(n)时间。在常规的HashMap中,删除需要固定的时间。根据,它不是: 此类提供所有可选的Map操作,并允许空元素。与HashMap类似,它为基本操作(add、contains和remove)提供了恒定的时间性能,假设哈希函数将元素正确地分散在存储桶之间。性能可能略低于HashMap,这是由于维护链接列表的额外费用,但有一个例外:在LinkedHashMap的集合视图上迭代需要与映射大小成比
LinkedHashMap
中的删除需要线性时间,对吗。因为我们需要从保持插入顺序的链表中删除键,这需要O(n)
时间。在常规的HashMap
中,删除需要固定的时间。根据,它不是:
此类提供所有可选的Map
操作,并允许空元素。与HashMap
类似,它为基本操作(add
、contains
和remove
)提供了恒定的时间性能,假设哈希函数将元素正确地分散在存储桶之间。性能可能略低于HashMap,这是由于维护链接列表的额外费用,但有一个例外:在LinkedHashMap
的集合视图上迭代需要与映射大小成比例的时间,而不管其容量如何。在HashMap
上的迭代可能更昂贵,需要与其容量成比例的时间
LinkedHashMap
不会覆盖HashMap#remove(对象键)
方法。后者从表中删除与键对应的项,并对已删除的项调用recordremove()
方法,该方法调整已删除项的上一个和下一个项的链接。列表中没有迭代来删除某个索引处的节点。LinkedHasMap使用一个将HashMap.Entry子类化的条目,因此成本较高,但仍然不变
每次在HashMap中删除条目时,都会调用RecordRemove(HashMap m)方法。它在HashMap.Entry中的实现为空,但LinkedHasMap。条目(仅从列表中删除条目):
}
顺序如下:
- 移除HashMap调用RemoveEntryWorkey中的实现(HashMap:line551)
public V remove(对象键){ 条目e=RemoveEntryWorky(键); 返回值(e==null?null:e.value); }
- HashMap中的RemoveEntryWorkey调用entry.RecordRemove(此)(HashMap:line560)
最终输入RemoveEntryWorky(对象键){ [...] while(e!=null){ 条目next=e.next; 对象k; 如果(e.hash==hash&& ((k=e.key)==key | |(key!=null&&key.equals(k))){ [...] e、 记录删除(本); 返回e; } prev=e; e=下一个; } 返回e; }
- Entry中的RecordRemove实现调用上面的remove方法,即O(1)(LinkedHashMap:line357)
void记录删除(HashMap m){ 删除(); }
对特定链表节点的引用是用条目存储在内部的,所以删除也是O(1)@SashaSalauyou是的,这很有意义。如果你发布你的答案,我会接受,因为你明确说明了为什么它是常量。谢谢,但我相信这不是答案,只是一个注释=)
/**
* Removes this entry from the linked list.
*/
private void remove() {
before.after = after;
after.before = before;
public V remove(Object key) {
Entry<K,V> e = removeEntryForKey(key);
return (e == null ? null : e.value);
}
final Entry<K,V> removeEntryForKey(Object key) {
[...]
while (e != null) {
Entry<K,V> next = e.next;
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k)))) {
[...]
e.recordRemoval(this);
return e;
}
prev = e;
e = next;
}
return e;
}
void recordRemoval(HashMap<K,V> m) {
remove();
}