简单的LinkdHashMap,一句话概括“继承HashMap,自己本身有个双向链表”

LinkdHashMap

         1、LinkdHashMap简介

                   在工作中,我们经常使用的存储k-v的工具为HashMap,但是HashMap遍历时的顺序是无序的,但是由于某些特殊的原因,我们想要打印出的顺序是有序的,此时最好的解决方案也就是我们的这次的主角“LinkdHashMap”

          2、LinkdHashMap实现原理

                  继承HashMap中的所有方法,只在Node内部类中,维护一个双向链表,以达到遍历时直接打印双向链表即可,但其他方法比如,get,put等等方法还是用HashMap中的方法

    //重写了Node内部类,增加了一个双向链表
    public static class Entry<K,V> extends HashMap.Node<K,V> {
        //LinkdHashMap中的核心  双向链表
        Entry<K,V> before, after;
        //实现HashMap中的node赋值
        Entry(int hash, K key, V value, Node<K,V> next) {
            super(hash, key, value, next);
        }
    }   

    //创建Node时,维护双向链表
    Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
        LinkedHashMap.Entry<K,V> p =
                new LinkedHashMap.Entry<K,V>(hash, key, value, e);
        //其他地方一样 linkNodeLast是为了维护双向链表
        linkNodeLast(p);
        return p;
    }

    //将传进来的值双向维护
    private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
        LinkedHashMap.Entry<K,V> last = tail;
        tail = p;
        if (last == null)
            head = p;
        else {
            p.before = last;
            last.after = p;
        }
    }

                   

猜你喜欢

转载自blog.csdn.net/qq_38384460/article/details/112920131
今日推荐