zoukankan      html  css  js  c++  java
  • 从源码分析:LinkedHashMap的get方法

    LinkedHashMap中重写了HashMap的get方法,不止会取出所索要的节点的值,而且会调整LinkedHashMap中内置的链表中该键所对应的节点的位置,将该节点置为链表的尾部。

    public V get(Object key) {
        Node<K,V> e;
        if ((e = getNode(hash(key), key)) == null)
            return null;
        if (accessOrder)
            afterNodeAccess(e);
        return e.value;
    }
    
    void afterNodeAccess(Node<K,V> e) { // move node to last
        LinkedHashMap.Entry<K,V> last;
        // 首先判断尾部节点是否为要移动的节点,如果不是的话才进入下一步的操作
        if (accessOrder && (last = tail) != e) {
            // 为e重新赋名,并保存其前一节点与后一节点
            LinkedHashMap.Entry<K,V> p =
                (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
            // 将指向后一节点的指针清空
            p.after = null;
            // 如果没有前一节点,则将该节点的后一节点设为头节点,否则,将其前置节点的后节点指针指向p的后置节点
            if (b == null)
                head = a;
            else
                b.after = a;
            // 如果后置节点不为空,则将前置节点的后节点指针指向p的后置节点,否则,将last指向p的前置节点
            if (a != null)
                a.before = b;
            else
                last = b;
            // 如果last为空,说明没有前面的节点了,则将LinkedHashMap的头节点指向p,否则,将p的前节点指针指向last,last的后节点指针指向p
            if (last == null)
                head = p;
            else {
                p.before = last;
                last.after = p;
            }
            // 最后,将LinkedHashMap的尾节点指向p
            tail = p;
            ++modCount;
        }
    }
    
  • 相关阅读:
    GTK+(基于DirectFB)的字体处理
    控制的字体属性
    [linux手机平台]让应用程序单实例运行
    serif vs sans serif
    关于做事的几点感想
    推荐一部环保电影难以忽视的真相
    短信应用设计备忘录
    手机搜索设计备忘录
    一点概念,
    毕业了,怎么策划的让有意思点呢,
  • 原文地址:https://www.cnblogs.com/liulaolaiu/p/11744378.html
Copyright © 2011-2022 走看看