• LinkedHashMap 与 HashMap 实现的区别


    阅读前最好对 HashMap 的内部实现方式有一定了解

    LinkedHashMap 继承自 HashMap

    主要重写了一个节点类 LinkedHashMap.Entry,并维护一个头结点尾节点

    以及重写了 newNode()方法,此方法 HashMap 主要用来添加时创建新节点使用,可以看一下 HashMap 中的源码:

    // HashMap.java 
    
    public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }
    
    final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
                   boolean evict) {
        Node<K,V>[] tab; Node<K,V> p; int n, i;
        if ((tab = table) == null || (n = tab.length) == 0)
            n = (tab = resize()).length;
        if ((p = tab[i = (n - 1) & hash]) == null)
            tab[i] = newNode(hash, key, value, null);  // newNode 方法代码在 LinkedHashMap 中被重写
        else {
        // 余下部分省略,有兴趣可以看一下对应源码  
    }

    这样当使用 LinkedHashMap 添加节点时,会调用 HashMap 的 put(key,value)方法,其又会调用 LinkedHashMap 的 newNode 方法,创建了一个继承自 HashMap.Node 类的 包含上一节点、下一节点信息的  LinkedHashMap.Entry 节点类

    // LinkedHashMap.java
    
    // LinkedHashMap 类中的节点类
    static class Entry<K,V> extends HashMap.Node<K,V> {
        Entry<K,V> before, after;
        Entry(int hash, K key, V value, Node<K,V> next) {
            super(hash, key, value, next);
        }
    }
    
    // 创建新节点的方法
    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(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;
        }
    }

    这样最后遍历的时候即可通过 头尾节点依次有序访问,按照插入时的顺序返回

    另:TreeMap 内部使用的是红黑树,遍历时按照 key 值从小到大依次返回

  • 相关阅读:
    Tips_of_JS 之 利用JS实现水仙花数的寻找与实现斐波那契数列
    我的天!居然可以这么“弹”!—— 弹性盒布局属性详述
    震惊,正儿八经的网页居然在手机上这样显示!
    这是假的JS——利用CSS Animation实现banner图非交互循环播放
    小K的H5之旅-HTML5与CSS3部分新属性浅见
    CSS小技巧-煎蛋的画法~
    小K的H5之旅-实战篇(一)
    SSM+Redis简介
    Hadoop HA(高可用搭建)
    hadoop完全分布式搭建(非高可用)
  • 原文地址:https://www.cnblogs.com/zawier/p/7566943.html
Copyright © 2020-2023  润新知