转载

给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析

/**      * LinkedHashMap entry.      */     private static class Entry<K,V> extends HashMap.Entry<K,V> {         // These fields comprise the doubly linked list used for iteration.         // 双向链表的上一个节点before和下一个节点after         Entry<K,V> before, after ;         // 构造方法直接调用父类HashMap的构造方法(super)        Entry( int hash, K key, V value, HashMap.Entry<K,V> next) {             super(hash, key, value, next);         }          /**          * 从链表中删除当前节点的方法          */         private void remove() {             // 改变当前节点前后两个节点的引用关系,当前节点没有被引用后,gc可以回收             // 将上一个节点的after指向下一个节点             before.after = after;             // 将下一个节点的before指向前一个节点             after.before = before;         }          /**          * 在指定的节点前加入一个节点到链表中(也就是加入到链表尾部)          */         private void addBefore(Entry<K,V> existingEntry) {             // 下面改变自己对前后的指向             // 将当前节点的after指向给定的节点(加入到existingEntry前面嘛)             after  = existingEntry;             // 将当前节点的before指向给定节点的上一个节点             before = existingEntry.before ;              // 下面改变前后最自己的指向             // 上一个节点的after指向自己             before.after = this;             // 下一个几点的before指向自己             after.before = this;         }          // 当向Map中获取查询元素或修改元素(put相同key)的时候调用这个方法         void recordAccess(HashMap<K,V> m) {             LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;             // 如果accessOrder为true,也就是使用最近较少使用顺序             if (lm.accessOrder ) {                 lm. modCount++;                 // 先删除,再添加,也就相当于移动了                 // 删除当前元素                 remove();                 // 将当前元素加入到header前(也就是链表尾部)                 addBefore(lm. header);             }         }          // 当从Map中删除元素的时候调动这个方法         void recordRemoval(HashMap<K,V> m) {             remove();         } }

可以看到Entry继承了HashMap中的Entry,但是LinkedHashMap中的Entry多了两个属性指向上一个节点的before和指向下一个节点的after,也正是这两个属性组成了一个双向链表。等等。。。Entry还有一个继承下来的next属性,这个next是单向链表中用来指向下一个节点的,怎么回事嘛,怎么又是单向链表又是双向链表呢,都要晕了对不对,其实想的没错,这里的节点即是Hash表中的单向链表中的一个节点,它又是LinkedHashMap维护的双向链表中的一个节点,是不是瞬间觉得高大上了。图解一下吧(不要告诉我图好乱,我看不懂。。。)

给jdk写注释系列之jdk1.6容器(5)-LinkedHashMap源码解析

原文  http://www.importnew.com/17561.html
正文到此结束
Loading...