LinkedHashMap从入门到入土

深入浅出LinkedHashMap

介绍

​ 可以看做是HashMap+LinkedList,它即使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序,内部采用双向的形式将所有元素连接起来。

  • 继承自HashMap,大多数方法没有重写比如remove、put方法

  • 一个key被重新插入,顺序不受影响

  • 非同步,可以调用Collections来实现类同步

  • assess-ordered结构性的修改会响应遍历的顺序的

  • 迭代有序

  • 比HashMap多了一个双向链表的维护,大多数方法都由HashMap实现了。

  • 底层是散列表加双向链表

  • 插入的顺序是有序的(底层链表导致有序)

  • 可以用来实现最近LRU算法,是页面置换算法常用的一种。

  • 提供了map应用的算法,允许为null,不同步,可以调用Collection来实现同步

  • 与HashMap一样,初始容量和装载因子对LinkedHashMap影响很大,但它遍历时初始容量是不受有序性

  • 其可以设置两种遍历顺序:

    • 访问顺序
    • 插入顺序(默认情况)

结构图

首先先看一下LinkedHashMap的类继承图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h2DaVFWu-1595400107143)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200721111121.png)]

分析

参数

  • 继承HashMap的Node节点,它是双向链表,包含前置指针和后置指针
  • 在构件新节点时,构件的是LinkedHashMap.Entry不再是Node。

方法

构造方法
  • 调用的是HashMap的构造方法,并且默认使用的是插入顺序。
put方法

没有重写,直接调用的是HashMap的put方法。只是在创建节点的时候,调用的是LinkedHashMap重写的方法。

get方法
 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;
    }
  • 调用HashMap定义的方法获取对应的节点
  • 如果是访问顺序的时候,把该节点放到链表的最后面
remove方法

LinkedHashMap并没有重写remove方法,只是重写了afterNodeRemoval方法。

遍历方法

​ 从内部维护的双链表的表头开始循环输出,因为遍历的是双向链表,而不是散列表,所以初始容量对遍历没有影响

常见问题

猜你喜欢

转载自blog.csdn.net/issunmingzhi/article/details/107513189
今日推荐