Java 中的 LinkedHashMap 和 HashMap

作者: 光剑书架上的书 | 来源:发表于2020-03-11 11:09 被阅读0次

    Java 中的 LinkedHashMap 和 HashMap 有什么关系?

    共同点:

    HashMap,LinkedHashMap,TreeMap都属于Map;
    Map 主要用于存储键(key)值(value)对:

    根据键得到值,因此键不允许键重复,但允许值重复。

    它们的继承关系是:

    不同点:

    1.HashMap里面存入的键值对在取出的时候是随机的,也是我们最常用的一个Map.它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。

    2.TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

    1. LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现. (例如, 应用场景:购物车等需要顺序的).

    大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭代HashMap的顺序并不是HashMap放置的顺序,也就是无序。HashMap的这一缺点往往会带来困扰,因为有些场景,我们期待一个有序的Map。

    这个时候,LinkedHashMap就闪亮登场了,它虽然增加了时间和空间上的开销,但是通过维护一个运行于所有条目的双向链表 (doubly-linked list),LinkedHashMap保证了元素迭代的顺序。该迭代顺序可以是插入顺序或者是访问顺序。

    1、LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。

    2、LinkedHashMap的基本实现思想就是-多态。可以说,理解多态,再去理解LinkedHashMap原理会事半功倍;反之也是,对于LinkedHashMap原理的学习,也可以促进和加深对于多态的理解。

    为什么可以这么说,首先看一下,LinkedHashMap的定义:

    public class LinkedHashMap<K,V>
        extends HashMap<K,V>
        implements Map<K,V>
    {
        ...
    }
    

    看到,LinkedHashMap 是HashMap的子类,自然LinkedHashMap也就继承了HashMap中所有非private的方法。

    LinkedHashMap中的双向链表 (doubly-linked list)

        /**
         * HashMap.Node subclass for normal LinkedHashMap entries.
         */
        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);
            }
        }
    
        /**
         * The head (eldest) of the doubly linked list.
         */
        transient LinkedHashMap.Entry<K,V> head;
    
        /**
         * The tail (youngest) of the doubly linked list.
         */
        transient LinkedHashMap.Entry<K,V> tail;
    
        /**
         * The iteration ordering method for this linked hash map: <tt>true</tt>
         * for access-order, <tt>false</tt> for insertion-order.
         * true 表示最近最少使用次序,false 表示插入顺序
         * @serial
         */
        final boolean accessOrder;
    

    附: 集合类架构图


    Kotlin 开发者社区

    国内第一Kotlin 开发者社区公众号,主要分享、交流 Kotlin 编程语言、Spring Boot、Android、React.js/Node.js、函数式编程、编程思想等相关主题。

    越是喧嚣的世界,越需要宁静的思考。

    相关文章

      网友评论

        本文标题:Java 中的 LinkedHashMap 和 HashMap

        本文链接:https://www.haomeiwen.com/subject/bkcqjhtx.html