從源碼分析: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;
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM