Java教程

LinkedHashMap 源码

本文主要是介绍LinkedHashMap 源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

LinkedHashMap

LinkedHashMap是一个有序的HashMap,它继承了HashMap, 其顺序有两种:按照访问的顺序和按照存储的顺序。顺序是由accessOrder字段控制,若accessOrder=true则说明是按照访问的顺序。若accessOrder=false则说明是按照存储的顺序。

其底层的数据结构是 HashMap+双向链表。如图所示:

LinkedHashMap的大部分方法都是采用HashMap的方法,比如put,remove等,我们接下来只说有关双向链表的部分

LinkedHashMap.Entry

LinkedHashMap的最底层Node是LinkedHashMap.Entry,他继承了HashMap.Node,同时具有两个新的指针before和after来构成双向链表

也就是说LinkedHashMap.Entry共有三个指针before,after和来自HashMap.Node的next

head和tail

LinkedHashMap存储了双向链表的head 和 tail

put方法

put方法调用的是hashmap的put方法

关键在于LinkedHashMap重写了newNode方法,在newNode中完成了put时的 在双向链表的结尾添加节点

在put完成后,又执行了afterNodeInsertion方法:

这个方法在HashMap中为空方法,在LinkedHashMap中重写了它

一般情况下,这个方法不会执行任何操作!因为removeEldestEntry的返回结果默认为false,他是让我们用来扩展的,我们可以重写它使得满足一定条件下移除队首节点(可以用它来实现LRU)

get

LinkedHashMap重写了get方法

如果顺序是访问顺序的话,get后会将get的节点放在链表的尾部

remove

remove同put一样调用的是HashMap的方法,只不过多一个afterNodeRemoval,调整双向链表中节点的顺序

这篇关于LinkedHashMap 源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!