LinkedHashMap

来源:互联网 发布:js添加节点 编辑:程序博客网 时间:2024/05/22 17:26

LinkedHashMap使用双向循环链表链接所有的Entry元素。

public class LinkedHashMap<K,V>   extends HashMap<K,V>    implements Map<K,V>


LinkedHashMap是在HashMap的基本上进行实现。它与HashMap最大的不同是,类中有一个头节点变量private transient Entry<K,V> header和具有前驱和后继节点的Entry。

private static class Entry<K,V> extends HashMap.Entry<K,V> {        // These fields comprise the doubly linked list used for iteration.        <span style="color:#ff0000;">Entry<K,V> before, after;</span>Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {            super(hash, key, value, next);        }        /**         * Removes this entry from the linked list.         */        private void remove() {            before.after = after;            after.before = before;        }        /**         * Inserts this entry before the specified existing entry in the list.         */        private void addBefore(Entry<K,V> existingEntry) {            after  = existingEntry;            before = existingEntry.before;            before.after = this;            after.before = this;        }        /**         * This method is invoked by the superclass whenever the value         * of a pre-existing entry is read by Map.get or modified by Map.set.         * If the enclosing Map is access-ordered, it moves the entry         * to the end of the list; otherwise, it does nothing.         */        void recordAccess(HashMap<K,V> m) {            LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;            if (lm.accessOrder) {                lm.modCount++;                remove();                addBefore(lm.header);            }        }        void recordRemoval(HashMap<K,V> m) {            remove();        }    }

重写了父类中的init()方法,来初始化header节点。

添加元素时,比HashMap多一步操作,即同时把改元素添加到双向循环链表。

void createEntry(int hash, K key, V value, int bucketIndex) {        HashMap.Entry<K,V> old = table[bucketIndex];Entry<K,V> e = new Entry<K,V>(hash, key, value, old);        table[bucketIndex] = e;       <span style="color:#ff0000;"> e.addBefore(header);</span>        size++;    }


0 0
原创粉丝点击