zoukankan      html  css  js  c++  java
  • LinkedHashMap 实现总结

    1. 继承于HashMap,定义了新的内部类Entry用于实现双向链表保存记录的插入或访问顺序;
    2. accessOrder用于指示链表保存记录采用的顺序,true为访问顺序,false为插入顺序;
    3. 加入新的记录时需要更新链表,访问记录时需要更新链表(更具accessOrder值判断是否实际更新);
    4. removeEldestEntry方法在LinkedHashMap用于表示缓存时有用,通过重载该方法(修改更新链表的逻辑以及返回值),删除有限容量下缓存中的最旧记录;
     1 public class MyLinkedHashMap<K, V> extends MyHashMap<K, V> {
     2     private boolean accessOrder;
     3 
     4     private Entry<K, V> header;
     5 
     6     public V get(K k) {
     7         Entry<K, V> e = (Entry<K, V>) getEntry(k);
     8         if (e == null) {
     9             return null;
    10         }
    11         e.recordAccess(this);
    12         return e.value;
    13     }
    14 
    15     @Override
    16     void addEntry(K k, V v, int index) {
    17         MyHashMap.Entry<K, V> old = table[index];
    18         Entry<K, V> e = new Entry<K, V>(k, v, old);
    19         table[index] = e;
    20         e.addBefore(header);
    21         size++;
    22         Entry<K, V> eldest = header.after;
    23         /**
    24          * 如果用於表示LRU算法的缓存,需覆盖removeEldestEntry,删除最旧条目同时返回true
    25          */
    26         if (removeEldestEntry(eldest)) {
    27             removeEntryForKey(eldest.key);
    28         } else {
    29             if (size >= threshold) {
    30                 resize(2 * table.length);
    31             }
    32         }
    33     }
    34 
    35     boolean removeEldestEntry(Entry<K, V> e) {
    36         return false;
    37     }
    38 
    39     private static class Entry<K, V> extends MyHashMap.Entry<K, V> {
    40         Entry<K, V> before, after;
    41 
    42         public Entry(K k, V v, MyHashMap.Entry<K, V> n) {
    43             super(k, v, n);
    44             // TODO Auto-generated constructor stub
    45         }
    46 
    47         private void remove() {
    48             before.after = after;
    49             after.before = before;
    50         }
    51 
    52         private void addBefore(Entry<K, V> existingEntry) {
    53             after = existingEntry;
    54             before = existingEntry.before;
    55             after.before = this;
    56             before.after = this;
    57         }
    58 
    59         void recordAccess(MyHashMap<K, V> m) {
    60             MyLinkedHashMap<K, V> lm = (MyLinkedHashMap<K, V>) m;
    61             if (lm.accessOrder) {
    62                 remove();
    63                 addBefore(lm.header);
    64             }
    65         }
    66 
    67     }
    68 
    69 }
  • 相关阅读:
    H5+ 分享到微信、朋友圈代码示例
    H5+ 重写在线升级版本比较代码
    H5+ a页面打开b页面,b页面加载成功后关闭当前页面,闪屏的规避解决方案
    MUI
    MUI
    MUI
    MUI
    Vue实战之【企业开发常见问题】
    step1:准备歌词之《前端开发是个啥》
    element-ui级联选择器(Cascader)获取级联对象 (主要是想获取:label值)
  • 原文地址:https://www.cnblogs.com/infinityu/p/3259428.html
Copyright © 2011-2022 走看看