概述
LinkedHashMap与HashMap的主要区别不在多述:LinkedHashMap是有序的而HashMap是无序的。具体来说,LinkedHashMap可以基于插入顺序或者访问顺序(Least Recently Used,最近最少使用)进行遍历。从这两个类名上,我们就可以一窥LinkedHashMap实现有序性的关键词:linked。
大体来说,相对于HashMap,LinkedHashMap的每个节点都额外增加了before与after两个链接,来记录顺序。遍历之时,只需把after复制给next即可:
1 | // 迭代器 |
既然LinkedHashMap相对于HashMap的最大区别仅仅是多维护了两个链接,那么这样的继承关系也是自然而然了:
1 | public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{} |
所以我们可以思考一下,在哪里需要对这两个链接进行维护?要记录插入顺序的话,需要在put后维护;访问顺序则在get后维护;而remove之后当然也需要维护,所以大致可以这样处理:
1 | public class MyLinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>{ |
在LinkedHashMap中,也维护了这三个方法,并运行了设计模式:模板方法模式。
导航
- 概述
- LinkedHashMap与HashMap:模板方法模式
- 钩子方法
- 其他
LinkedHashMap与HashMap:模板方法模式
模板方法模式定义了一些概念,如在父类中,相关方法被分为模板方法与基本方法两大类,基本方法又分为三类:钩子方法、抽象方法、具体方法。先看一个简单的例子:
1 | abstract class Foo { |
LinkedHashMap与HashMap的实现也运用了这种模式,如
1 | public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { |
钩子方法
现在,我们来具体看看这三个钩子方法:
1 | // 头结点 |
其他
除了实现钩子方法之外,LinkedHashmap还重写了一些HashMap的具体方法来维护before/after,head/tail
1 | // 维护head、tail结点 |