Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LinkedHashMap与HashMap中的删除_Java_Collections_Hashmap_Time Complexity - Fatal编程技术网

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){
    删除();
    }
    
HashMap的源代码:

LinkedHashMap的源代码:

对特定链表节点的引用是用条目存储在内部的,所以删除也是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();
}