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

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

共同点:

HashMap,LinkedHashMap,TreeMap都属于Map;

Map 主要用于存储键(key)值(value)对:

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

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

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

它们的继承关系是:

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

不同点:

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

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

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

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

大多数情况下,只要不涉及线程安全问题,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)

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

/**
     * 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;

附: 集合类架构图

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

Kotlin 开发者社区

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

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

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

原文 

http://mp.weixin.qq.com/s?__biz=MzA5OTI2MTE3NA==&mid=2658338490&idx=6&sn=8aad262cf30d24197adf4783319f8fa3

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Java 中的 LinkedHashMap 和 HashMap 有什么关系?

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址